numpy 入门
numpy 库
简介
- 提供了多维数组、矩阵的常用操作和一些高效的科学计算函数。
- 底层运算通过 C 语言实现,处理速度快、效率高,适用于大规模多维数组。
- 可以直接完成数组和矩阵运算,无需循环。
多维数组
形状(Shape):是一个元组,描述数组的维度,以及各个维度的长度。 长度(Length):某个维度中的元素个数。 shape(5,) 长度为 5 的一维数组, shape(30,5) 30x5 的二维数组,shape(10, )
NumPy 数组 ★ 每个数组都是一个 ndarray 对象 ★ 数组中的元素数据类型相同 ★ 数组中的元素下标从 0 开始 ★ 数组对象的常用属性:维数、形状、数据类型等。
数组创建
array([list]/(tuple)) 定义数组时,可以指定 dtype 数据类型: array([list]/(tuple),dtype=数据类型)
asarray() 函数:将列表或元组转化为数组对象
当数据源本身已经是一个 ndarray 对象时, array() 仍然会复制出一个副本,而 asarray() 则直接引用了本来的数组。
数组属性
属性 | 描述 |
---|---|
ndim | 数组的维数 |
shape | 数组的形状 |
size | 数组元素的总个数 |
dtype | 数组中元素的数据类型 |
itemsize | 数组中每个元素的字节数 |
特殊数组
函 数 | 功能描述 |
---|---|
np.arange() | 创建数字序列数组 |
np.ones() | 创建全 1 数组 |
np.zeros() | 创建全 0 数组 |
np.eye() | 创建单位矩阵 |
np.linspace() | 创建等差数列 |
np.logspace() | 创建等比数列 |
- arange() 函数:创建一个由数字序列构成的数组(步长可为小数),类似于
range()
1
2
3np.arange(起始数字,结束数字,步长,dtype=数据类型)
np.arange(4)
np.arange(0,2,0.2) - ones() 函数:创建一个元素全部为 1 的数组
1
2
3
4
5
6
7
8
9
10np.ones(shape, dtype=数据类型)
3,2),dtype=np.int32) np.ones((
array([[1, 1],
[1, 1],
[1, 1]], dtype=int32)
# 默认是 float64 类型
3,2)) np.ones((
array([[1., 1.],
[1., 1.],
[1., 1.]]) - zeros() 函数,np.zeros(shape, dtype=数据类型)
- eye() 函数,np.eye(shape) shape 不用单独加元组括号
- linspace()函数
np.linspace(start, stop, num)
区间 [start, stop]中 num 个数 - logspace() 函数
np.logspace(start, stop, num, base)
区间 [base^start, base^stop]中 num 个数
数组切片
二维数组
1 | b |
三维数组
1 | In [3]: t |
改变数组形状
函数 | 功能描述 |
---|---|
np.reshape(shape) | 不改变当前数组,按照 shape 创建新的数组 |
np.resize(shape) | 改变当前数组,按照 shape 创建数组 |
注意:当改变形状时,应该考虑到数组中元素的个数,确保改变前后,元素总个数相等。
创建数组,并改变数组形状
1 | In [63]: a=np.logspace(0,5,6,base=2,dtype=np.int64).reshape(2,3) |
np.reshape(shape) 中 shape 的值可以把其中的某一个维度设置为 -1,让 numpy 根据数组中元素总个数、以及其他维度的取值,来自动计算出这个维度的取值。 例如:将多维转换为一维
1 | In [67]: a |
数组运算
numpy 支持数组的四则运算和逆运算. 一维数组可以和多维数组相加,相加时,会将一维数组扩展到多维。 当两个数组中元素的数据类型不同时,精度低的数据类型,会自动转换为精度更高的数据类型,然后再进行运算。
幂运算:对数组中的每个元素求 n 次方
矩阵相乘:
- 乘号运算符:矩阵中对应的元素分别相乘,c=a*b
- 矩阵相乘(点乘):按照矩阵相乘的规则运算 np.matmul(a,b) np.dot(a,b)
矩阵转置和求逆 矩阵转置:np.transpose(a) 矩阵求逆:np.linalg.inv(a)
数组元素之间的运算
函数 | 功能描述 |
---|---|
numpy.sum() | 计算所有元素的和 |
numpy.prod() | 计算所有元素的乘积 |
numpy.dif() | 计算数组的相邻元素之间的差 |
np.sqrt() | 计算各元素的平方根 |
np.exp() | 计算各元素的指数值 |
np.abs() | 取各元素的绝对值 |
求和
轴(axis):数组中的每一个维度被称为一个轴。 秩(rank):轴的个数。
![16151051607795](https://blog-1259556217.cos.ap-chengdu.myqcloud.com/image/16151051607795.jpg)
数组堆叠
np.stack((数组1,数组2,..), axis)
在不同的轴方向上,进行堆叠,新出现的轴是哪个轴,axis=几
![16151055149631](https://blog-1259556217.cos.ap-chengdu.myqcloud.com/image/16151055149631.jpg)
1 | In [120]: a = np.array([[1, 2, 3], [4, 5, 6]]) |
矩阵和随机数
numpy.matrix
matrix(字符串/列表/元组/数组) / mat(字符串/列表/元组/数组) 当参数为字符串时,各个元素之间空格分割,不同行用分号分割。
1 | In [128]: a=np.mat("1 2 3;4 5 6") |
矩阵对象, 同样具备 ndim,shape,size,dtype 属性。
矩阵运算
矩阵之间乘号是矩阵相乘。
1 | In [140]: a1,a2 |
矩阵转置:.T
, 矩阵求逆:.I
1 | In [144]: a1.T |
矩阵 vs 二维数组
numpy 中的矩阵和二维数组相似,在很多时候是通用的
矩阵 | 二维数组 |
---|---|
运算符号简单; A*B | 能够表示高维数组; 数组更加灵活,速度更快 |
随机数
函数 | 功能描述 | 返回值 |
---|---|---|
np.random.rand(d1,.,dn) | 元素在[0,1)区间均匀分布的数组 | 浮点数 |
np.random.uniform(low,high,size) | 元素在[low,high)区间均匀分布的数组 | 浮点数 |
numpy.random.randint(low,high, size) | 元素在[low,high)区间均匀分布的数组 | 整数 |
np.random.randn(d0,.,dn) | 产生标准正态分布的数组 | 浮点数 |
np.random.normal(loc, scale, size) | 产生均值为 loc,方差为 scale 的正态分布的数组 | 浮点数 |
1 | In [27]: np.random.normal(0,1,(3,2)) |
伪随机数:由随机种子,根据一定的算法生成的。 随机种子:指定随机数生成时所用算法开始的整数值。
- 如果使用相同的 seed()值,则每次生成的随即数都相同。
- 如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
- 采用 seed()函数设置随机种子,仅一次有效。
- 随机数产生的算法,和系统有关。
1 | np.random.seed(num) 设置随机数种子 |