[NumPy]基础大全
import numpy as np
一、数据类型简介
Numerical Python:底层代码为C,支持处理大量数据
所有 Numpy 数据类型都是 numpy.generic 的子类
支持向量运算:N维数组对象,只允许存储相同的数据类型
支持 float、int、bool、timedelta[ns]、datetime64[ns]等
![](https://img.haomeiwen.com/i1708356/e073ffbf4e257411.png)
注意:Numpy 不支持带时区信息的 datetime
- 数据结构的特性
多维数组np.array():向量、矩阵运算
默认行向量
axis = 0 表示跨行;
axis = 1 表示跨列;
支持的数据类型@图-核心、创建、保存
实用的线性代数、傅里叶变换和随机数生成函数
和稀疏矩阵运算包scipy配合使用更加方便
二、具体操作
- 区分函数与方法 (以reshape为例)
目标类型 | 说明 |
---|---|
函数 | 基于模块 np.reshape(array, [index参数]) +传递实参 +不修改原始数据——>需要赋值,或者直接输出 |
方法 | ndarray.reshape() +相当于以array为对象进行的操作/属性 +更改原始数据,相当于inplace = True |
- 创建
默认数据类型是'int64'
或'float64'
初始化
np.array([], dtype = np.int64)
np.copy()
浅复制(深复制用赋值=
)初始化函数
np.zeros(shape)
np.empty(shape)
每个值都接近于零
np.ones(shape)
np.full(shape, constant value)
np.eye(N)
np.diag([对角线元素列表])
np.arange(start,stop,step)
左闭右开[start, stop) 类似pythonrange()
;允许间隔为非整数,例如 0.3,但是由于浮点数精度有限, 建议np.linspace()
np.linspace(start, stop, N)
随机数模块random
np.random.seed(0)
np.random.rand(shape)
np.random.random(shape)
np.random.randint(start, stop, size = shape)
np.random.uniform()
均匀分布
np.random.normal(mean, standard deviation, size=shape)
统计学特定分布特性
np.random.permutation(N)
创建一个秩为 1 的 ndarray,其中包含随机排列的行索引(用来随机打乱数据集-N个元素的顺序)
- 查/改/增/删
属性:数据类型
.dtype
具体元素的类型
.dtype.name
查看数据类型,name是.dtype的一个属性
.astype(np.float64)
转换数据类型
注意:修改数据类型,只能用.astype查
- 数值型索引
- 布尔型索引
ndarray[np.where(逻辑判断表达式)]
np.where(x>0,x,0)
小于0的值用0填充,大于0的数不变,是三元表达式 x if condition else y 的矢量化版本
np.where(np.isnan(ndarray), 0, ndarray)
np.where(ndarray != 0)
np.argwhere(ndarray ==0)
返回下标
np.any()
np.all()
np.unique(ndarray)
返回给定 ndarray 中的 唯一元素(去重后的元素)
np.in1d(ndarray, [查找目标元素])
类似in
np.nonzero()
非零检测,第一个array表示行坐标,第二个array表示列坐标- 切片
左闭右开,提取某行/列
将数据集拆分为训练集、交叉验证集和测试集
ndarray[start : end]
ndarray[start : ]
ndarray[: end]
注意:Z = X[1:4,2:5] 对 Z 做出更改,也会更改原始数据X中相应的元素
改
- 索引修改
np.clip(A,5,9)
设定上下限,在5-9之间,保持原始数据不变,小于5,则为5;大于9则为9
ndarray.flatten()
多维变为一维
- 数组转置为矩阵
A[np.newaxis,:]
(3,)变为(1, 3)
A[:,np.newaxis]
- 合并
np.vstack((ndarray1, ndarray2))
上下-垂直堆叠
np.hstack((ndarray1, ndarray2))
水平堆叠
np.meshgrid()
接受两个一维数组并产生二维矩阵
np.concatenate(axis=)
多个矩阵合并- 分割
.reshape()
- 均匀分割
np.split(axis=0)
默认水平线分割(跨行)
np.vsplit()
横向分割,等价于np.split(axis=0)
np.hsplit()
默认垂直线分割(跨列),等价于np.split(axis=1)
,指定要返回的相同shape的array的数量,或者通过指定分割应该发生之后的列来沿着其横轴拆分原array- 不均匀分割
np.array_split()
默认纵向(axis=0 跨行)增
np.append(ndarray, elements, axis)
np.insert(ndarray, index, elements, axis)
删
np.delete(ndarray, elements, axis)
- 排序/遍历/统计
排序
np.sort(ndarray, axis= )
当做函数使用时,它不会对ndarray进行就地排序遍历
np.diag(ndarray, k=N)
k=0,表示主对角线(对角线元素提取)
for … in
统计
.shape
维度
.size
元素个数
len(x)
输出的矩阵长度,也就是所谓的行数
.ndim
可以输出矩阵维数,即列数
np.bincount(ndarray)
统计索引出现次数 下标0、1、2等出现的次数
np.bincount(ndarray, weights=[])
权重列表的元素个数与ndarray对应,相加不必为1:即在次数结果的基础上,叠加权重的影响
np.bincount(ndarray,weights=[], minlength=)
当minlength的数量多于ndarray元素的数量,后面没访问到的设置为0
应用:np.argmax(np.bincount(ndarray))
表示出现次数最多的元素的下标/索引数值
三、特性:数学计算
- 元素
np.add(x,y)
np.subtract(x,y)
np.multiply(x,y)
np.divide(x,y)
np.abs()
np.square()
np.maximum()
np.exp(x)
np.sin()
np.sqrt(x)
np.power(x,2)
np.greater(x, y)
比较返回布尔值
注意:log函数
np.log(x, y)
以x为底
np.log()
以e为底
log10()
以10为底
- 矩阵
注意维度的区分:N维数组,有N层中括号[]
ndarray矩阵相乘的本质(底层逻辑)
- 实例:
np.dot((2, 1), (2, ))
报错(虽然第二个默认行向量,但终究不是1*2的行向量)
(2, 1): [[1], [2]]
(2, ): [3, 4]
(1, 2): [[3, 4]]正确的运算应该是:
np.dot((2, 1), (1, 2))
- 先去掉外层的[]:[1], [2] 与 [3, 4]
- 针对内层的[]:1和3, 4生成[3, 4]
- 最后生成
维度(2, 2)
的矩阵
注意:
np.dot((2, ), (2, 1)) == (1, )
默认行向量补充:
data[:, None]
本意:对一维数组来说,转置还是行向量(Numpy默认一维数组为行向量),所以可以用 arr[:,None] 来创建一个列向量(本质上是二维数组)
- 当data是
一维数组(n,)
,相当于转置(行、列向量的转换)
构造新的列:一维数据变为二维
- 当data是
矩阵(1, n)
时,data[:, None]
生成(1,1,n)
神经网络反向传播的启发
默认行向量,可用
.flatten()
或.ravel()
转化为一维数组(默认行向量)
- Hadamard乘积(对应元素相乘)
np.multiply()
*
乘法
一维数组对应元素相乘(2, )*(2, )=(2, )
矩阵相乘
一维数组内积np.dot((2, )(2, )) ==(1, )
一维数组相乘:列*行得到矩阵@权重的更新,用.reshape()
np.dot()
各种情况汇总(主要针对一维数组,二维数组-行向量/列向量)
(1, n) & (n, ) == (1, )
生成一维数组
(n, ) & (n, 3) == (3, )
: (n, 3)&(n, )报错
(1, n) & (n, 1) == (1, 1)
生成列向量(二维数组)特殊情况:
*乘法
广播展开(尾部维度一致)
(6, ) * (6, 1) == (6, 6)
(尾部维度为(6))
(6, 1) * (6, ) == (6, 6)
(尾部维度为(1))神经网络中的应用:针对反向传播
- 利用转置-调换位置计算反向误差
反向误差error
- 权重更新:列*行生成权重矩阵
当x, y均为一维数组时,下列两种方法等价
x[:, None] * y
y * x[:, None]
权重更新矩阵
转置
ndarray.T
ndarray.transpose()
.swapaxes()
接受一对轴变换
.reshape()
矩阵相乘
np.dot(a, b)
等价于a.dot(b)
如果a b都是一维的,表示内积;如果是二维以上,则为矩阵相乘
np.matmul(a, b)
矩阵乘积
注意:当a或b其中一个是标量的时候,只能用np.dot
,或*
,等价于元素乘法np.multiply
补充:
- 如果a是N维数组, b是1维数组,如(3,3,3)与(3,)矩阵相乘的结果是(3,3)
- 如果a是N维数组, b是M维数组(M>2)
维度变化 多维数组相乘
-
特性:广播
1 标量和 ndarray 之间
2 两个形状不同的 ndarray之间:形状相适应(尾部维度必须兼容)
本质:np.tile(ndarray, shape)
按照shape重复ndarray元素
ndarray 广播机制
-
特性:统计学函数(注意:参数
axis=
)
X.mean()
np.average()
X.sum()
X.std()
np.corrcoef(ndarray)
默认皮尔森相关系数,也可以用ranked correlation,也就是spearman correlation,可以直接用scipy.stats.spearmanr
np.median(X)
X.max()
X.min()
.argmin()
.argmax()
.cumsum()
累计和
.cumprod()
累计积
np.diff(x,axis=1)
默认axis=1 后面元素减去前面元素
np.around(decimals=)
四舍五入;decimals小数点位数,负数表示小数点前面的位数
np.floor()
np.ceil()
集合运算
np.intersect1d(x,y)
np.setdiff1d(x,y)
np.union1d(x,y)
四、拓展
- 补充:数据IO
np.save('my_array', ndarray)
将ndarray保存到叫做my_array.npy的文件中
y = np.load('my_array.npy')
- 补充:小技巧
方法的组合
np.sort(np.unique(x))
- 补充:numpy.linalg
有一个关于矩阵分解和像转置和行列式等的一个标准集合