[NumPy]基础大全

import numpy as np

一、数据类型简介

Numerical Python:底层代码为C,支持处理大量数据
所有 Numpy 数据类型都是 numpy.generic 的子类
支持向量运算:N维数组对象,只允许存储相同的数据类型
支持 float、int、bool、timedelta[ns]、datetime64[ns]等


[NumPy]基础大全_第1张图片
ndarray 数据类型

注意: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) 类似python range();允许间隔为非整数,例如 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

  1. 数值型索引
  2. 布尔型索引
    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表示列坐标
  3. 切片
    左闭右开,提取某行/列
    将数据集拆分为训练集、交叉验证集和测试集
    ndarray[start : end]
    ndarray[start : ]
    ndarray[: end]
    注意:Z = X[1:4,2:5] 对 Z 做出更改,也会更改原始数据X中相应的元素

  1. 索引修改

np.clip(A,5,9) 设定上下限,在5-9之间,保持原始数据不变,小于5,则为5;大于9则为9
ndarray.flatten() 多维变为一维

  1. 数组转置为矩阵
    A[np.newaxis,:] (3,)变为(1, 3)
    A[:,np.newaxis]
  2. 合并
    np.vstack((ndarray1, ndarray2)) 上下-垂直堆叠
    np.hstack((ndarray1, ndarray2)) 水平堆叠
    np.meshgrid() 接受两个一维数组并产生二维矩阵
    np.concatenate(axis=) 多个矩阵合并
  3. 分割
    .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. 先去掉外层的[]:[1], [2] 与 [3, 4]
  2. 针对内层的[]:1和3, 4生成[3, 4]
  3. 最后生成维度(2, 2)的矩阵
  • 注意:np.dot((2, ), (2, 1)) == (1, ) 默认行向量

  • 补充:data[:, None]
    本意:对一维数组来说,转置还是行向量(Numpy默认一维数组为行向量),所以可以用 arr[:,None] 来创建一个列向量(本质上是二维数组)

  1. 当data是一维数组(n,),相当于转置(行、列向量的转换)
    [NumPy]基础大全_第2张图片
    构造新的列:一维数据变为二维
  2. 当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))

神经网络中的应用:针对反向传播
  1. 利用转置-调换位置计算反向误差
    反向误差error
  2. 权重更新:列*行生成权重矩阵
    当x, y均为一维数组时,下列两种方法等价
    x[:, None] * y
    y * x[:, None]
    [NumPy]基础大全_第3张图片
    权重更新矩阵

转置

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

补充:

  1. 如果a是N维数组, b是1维数组,如(3,3,3)与(3,)矩阵相乘的结果是(3,3)
  2. 如果a是N维数组, b是M维数组(M>2)
    维度变化 多维数组相乘
  • 特性:广播
    1 标量和 ndarray 之间
    2 两个形状不同的 ndarray之间:形状相适应(尾部维度必须兼容)
    本质np.tile(ndarray, shape) 按照shape重复ndarray元素

    [NumPy]基础大全_第4张图片
    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
    有一个关于矩阵分解和像转置和行列式等的一个标准集合


References

你可能感兴趣的:([NumPy]基础大全)