目录
一 Numpy(Numerical Python)
1. Numpy 是什么
2. Numpy 的主要用途
二 Numpy 数组 VS Python 列表
三 Numpy 数据类型和属性
1. 数据类型
(1)了解数据类型
(2)代码示例
2. 数组属性
(1)一般数组属性
(2)代码示例
四 广播和矢量化
1. 对不同维度的数组进行加法运算
2. 对不同维度的数组进行乘法运算
五 结束语
六 参考链接
一 Numpy(Numerical Python)
1. Numpy 是什么
Numpy 是 Python 语言进行科学计算的一个基础拓展程序包,它支持大量的维度数组和矩阵运算,并且也提供了大量的数学函数库来进行数组运算。它是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
2. Numpy 的主要用途
Numpy 与 Matplotlib(Python 绘图库 Matplotlib) 等第三方库结合起来一起使用,提供了一个强大的科学数学计算环境,便于我们学习数据科学或者机器学习。
二 Numpy 数组 VS Python 列表
(1)Numpy 专门对数组的操作和运算进行了设计,存储效率和输入输出性能远远大于列表中的嵌套式运算,当数组的维度越大时,Numpy的优势更加明显。
(2)两者都可以对多维的数组进行操作,Numpy 中的 ndarray 是一个庞大的数据容器,可以轻松处理多维数组;列表通过嵌套进行多维数组的操作。
(3)Numpy 中的数组元素必须都是同质的,列表中的元素类型可以是多样的,因此列表的通用性能强于 Numpy,但在进行科学计算时,Numpy 的代码更为简单。
三 Numpy 数据类型和属性
1. 数据类型
(1)了解数据类型
Numpy 中的一般数据类型如下面的表格所示:
数据类型 | 描述 |
bool_ | 布尔数据类型(True或者False) |
int_ | 默认的整数类型 |
intc | 与C的int类型一样,一般是int32或者int64 |
intp | 用于索引的整数类型 |
int8/int16/int32/int64 | 有符号整数 |
uint8/uint16/uint32/uint64 | 无符号整数 |
float_ | float64类型的简写 |
float16 | 半精度类型:1个符号位,5个指数位,10个尾数位 |
float32 | 单精度类型:1个符号位,8个指数位,23个尾数位 |
float64 | 双精度类型:1个符号位,11个指数位,52个尾数位 |
complex_ | complex128的简写,即128位复数 |
complex64 | 64位复数,表示双32位浮点数(实数与虚数部分) |
complex128 | 128位复数,表示双64位浮点数(实数与虚数部分) |
(2)代码示例
一般使用 np.dtype() 语句可以对数据的类型、大小、字节顺序等进行描述:
"""
Author:XiaoMa
date:2021/12/30
"""
import numpy as np
dt = np.dtype(np.int32)#使用标量标签
print(dt)
dt = np.dtype('i1')#int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
print(dt)
dt = np.dtype('<i1')#字节顺序是通过对数据类型预先设定 < 或 > 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
print(dt)
#--------------------
#结构化数据类型的使用
#--------------------
dt = np.dtype([('age', 'i1')])#创建结构化数据类型
print(dt)
a = np.array([(10,), (20,), (30,)], dtype = dt)#将数据类型应用于数组对象
print(a)
print(a['age'])#类型字段名可用于存取实际的 age 列
#-----------------------------------------------------
#创建一个student结构,用来记录学生的姓名、成绩、年龄。
#-----------------------------------------------------
student = np.dtype([('name', 'S8'), ('age', 'i1'), ('marks', 'f')])
a = np.array([('XiaoMa', '21', '99.9'), ('XiaoYang', '20', '98.8'), ('XiaoWang', '21', '97.7')], dtype = student)
print(a)
得到输出如下:
在 python3 中 b' ' 代表字符串属于 bytes 类型,详细的介绍可以参考文章下方的链接。
2. 数组属性
(1)一般数组属性
在 Numpy 中数组的每一个线性的维度称为一个轴(axis),即轴代表一个一维数组。当我们对着 axis = 0 进行操作时,就是对数组的每一列元素进行操作;对 axis = 1进行操作时,就是对着数组的每一行元素进行操作。
在 Numpy 中数组的维度的数目称为秩(rank),也就是数组中的轴的数目,比如一维数组的秩为1,二维数组的秩为2。
numpy.ndarray 中的一些重要的对象属性如下:
ndarray.ndim: 秩,即维度或者轴的数目
ndarray.shape: 数组的维度,对于矩阵来说n行m列
ndarray.size: 数组中的元素的个数,即 n*m
ndarray.dtype: 数组对象的元素类型
ndarray.itemsize: 每一个元素的大小,以字节为单位
ndarray.flags: 数组对象的内存信息
ndarray.real: 数组对象的实部
ndarray.imag: 数组对象的虚部
(2)代码示例
"""
Author:XiaoMa
date:2021/12/30
"""
import numpy as np
#-------------------
#Numpy 中的数据属性
#-------------------
a = np.arange(24)
print(a.ndim)#打印a的秩,目前a的维度只有1
a = a.reshape(2, 4, 3)#调整a的结构形状
print(a.ndim)
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)#使用 .shape 打印数组的行数和列数
a.shape = (3, 2)#使用 .shape 来改变数组的1形状
print(a)
x = np.array([1, 2, 3, 4, 5], dtype = np.int8)#数组的数据类型为 int8(一个字节)
print(x.itemsize)#打印字节数,为1
y = np.array([1, 2, 3, 4, 5], dtype = np.float64)# 数组的数据类型为 float64(八个字节)
print(y.itemsize)#打印字节数,为8
print(x.flags)#打印数组元素的内存信息
得到的结果如下:
四 广播和矢量化
当使用 Numpy 对不同形状的数组进行数值计算时,在相应的元素上进行对相应的数组元素的算术计算,这就被称为 Numpy 广播,如:
1. 对不同维度的数组进行加法运算
a0 = np.array([[1, 2, 3], [4, 5, 6]])
a1 = np.array([[1, 0, 0]])
print(a0 + a1)
得到输出:
就是将一维数组加到了多维数组的每一个维度上
2. 对不同维度的数组进行乘法运算
a0 = np.array([[1, 2, 3], [4, 5, 6]])
a1 = np.array([[1, 0, 0]])
print(a0*a1)
得到输出:
可以看出,运算形式和加法是一样的,将会自行拓展与每一个维度相乘。
五 结束语
本篇博文主要简单介绍了 Python 语言中的科学计算基础库 Numpy 中的数据类型、数组属性以及矢量化运算,并加以代码实现加强理解。
六 参考链接
python列表和Numpy数组的区别
菜鸟教程
python中 r'', b'', u'', f'' 的含义
Bytes类型