Numpy 学习笔记
🚗Numpy 学习笔记
自学笔记|2024-11-28|Last edited: 2024-12-13
type
status
date
slug
summary
tags
category
icon
password

基础知识

ndarray.ndim数组的轴的个数
ndarray.shape数组的维度(一个整数的元组)
ndarray.size数组元素的总数。(shape的乘积)
ndarray.dtype数组中的元素类型

数组创建

a = np.array([1, 2, 3, 4])
b = np.array([(1.5, 2.3), (4, 5, 6)])
c = np.array([[1, 2], [3, 4]], dtype=complex)
  • zeros创建一个由0组成的数组,ones创建一个由1组成的数组,empty创建一个初始内容随机的数组。默认情况下,数组的dtype是float64类型的
    • np.zeros((3, 4), dtype=np.int16)
  • 类似于range的函数
    • np.arrange(10, 30, 5)[10, 30),步长为5
      np.linspace(0, 2, 9)9个数等距分布,第一个是0,最后一个是2

打印数组

当您打印数组时,NumPy以与嵌套列表类似的方式显示它,但具有以下布局:
  • 最后一个轴从左到右打印,
  • 倒数第二个从上到下打印,
  • 其余部分也从上到下打印,每个切片用空行分隔。
然后将一维数组打印为行,将二维数据打印为矩阵,将三维数据打印为矩数组表。
如果数组太大,Numpy会自动跳过数组的中心部分并只打印角点。要禁用此行为并强制Numpy打印整个数组,可以:np.set_printoptions(threshold=sys.maxsize)

基本操作

相同大小的矩阵可以进行加减乘除运算。
数学中的矩阵乘积可以使用@运算符或dot函数执行
A @ BA.dot(B)
当使用不同类型的数组进行操作时,结果数组的类型对应于更一般或更精确的数组(int转float)

常用方法

通过指定axis参数,可以沿数组的指定轴应用操作。

通函数

sin,cos,exp等

索引、切片和迭代

一维的数组可以进行索引、切片和迭代操作。
Tips:fromfunction函数,可以得到一个数组,该数组的每个元素是将该元素的下标带入指定函数所得到的结果。
多维的数组每个轴可以有一个索引。
当提供的索引少于轴的数量时,缺失的索引被认为是完整的切片。
如果想要对数组中的每个元素执行操作,可以使用flat属性。

形状操纵

以下三个命令都返回一个修改后的数组,而不会更改原数组
a.ravel()返回扁平后的数组
a.reshape(6, 2)第一轴有6维,第二轴有2维(六行两列)
如果将size指定为-1,则会自动计算。
a.T转置

ndarray.resize方法会修改数组本身。
a.resize((2, 6))

拷贝

完全不复制

简单的复制不会复制数组对象或其他数据。
函数调用也是简单复制,即传递的参数仍然是引用

浅拷贝(视图)

view方法创建一个查看相同数据的新数组对象。
改A数组中的数据,B数组也会改;改A数组的大小,B数组的大小不会改。
切片数组本质就是返回一个视图

深拷贝

copy方法

以下为进阶内容。

花式索引

使用索引数组进行索引

a数组是多维时,索引数组的元素指代的是a的第一维。
同样,我们也可以为多个维度提供索引。每个维度的索引数组必须具有相同的形状。
还可以将ij数组放入列表中进行索引。
可以使用数组索引作为“左值”。

使用布尔数组进行索引

思想:指定哪些是我们想要的元素
最简单的情况是bool数组和被索引数组具有相同的大小。
第二种情况更类似于整数索引;对于数组的每个维度,我们给出一个1D布尔数组,选择我们想要的切片。
1D布尔数组的长度必须要和被索引数组对应轴的长度一致。

线性代数

转置:a.tranpose()
取逆:np.linalg.inv(a)
单位阵:np.eye(2)(二阶单位阵)
矩阵乘法:j @ j
迹:np.trace(u)
解线性方程组:np.linalg.solve(a, y)a为系数矩阵,y为列向量。
特征值:np.linalg.eig(j)特征值和特征向量都会给出。
svd分解:np.linalg.svd(a)返回三个矩阵u, s, v,大小分别为(M, M), (M, N), (N, N)

用法积累

向量的范数

linalg.norm(x, ord=None, axis=None, keepdims=False)
  • ord:第几范数,默认是欧氏长度

allclose

np.allclose(a, b, rtol=1e-05, atol=1e-08)判断两个数组是否相等,rtol相对误差,atol绝对误差。

vstack、hstack和column_stack

pad

np.pad(array, pad_width, mode='constant', **kwargs)
array表示需要填充的数组
pad_width表示每个轴边缘需要填充的数值数目:((before_1, after_1), ..., (before_N, after_N))
mode为填充的模式:
  • constant 填充常数
    • constant_value与pad_width的大小相同
  • edge 填充边缘
  • linear_ramp

限制最大值和最小值

a.clip(0, 255)

改变数组的类型

a.astype(int)

生成正态分布

np.random.randn(d0, d1, d2, ...)
d0, d1, d2为生成数据的维度。

生成随机整数

np.random.randint(low, high)
生成 [low, high] 的随机整数
random.random_integers(low, high=None, size=None)
生成随机整数数组

标准差

numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>)
  • a:输入数组
  • axis:整数或者整数的元组
    • 计算指定轴

平均值

numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)
参数完全同上

最小值的下标

numpy.argmin(a, axis=None, out=None, *, keepdims=<no value>)
  • axis:
    • 如果不设置,那么返回的指标是被扁平化的指标
    • 否则沿着指定轴求最小值的下标

将满足条件的元素设定为某个值

a[a > 4] = 0

将函数向量化

将一个作用于普通元素的函数,转变成可以作用于一个 numpy.array 的函数。
class numpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, excluded=None, cache=False, signature=None)
  • pyfunc: 原函数
  • otypes: 输出数据的类型
  • doc: 函数的注释(文档)
  • excluded: 输入参数的哪个不需要被向量化
    • signature: 输入参数的形状
      • 例如一个矩阵乘一个向量:(m,n),(n)->(m)

    分割数组

    numpy.split(aryindices_or_sectionsaxis=0)
    • indices_or_sections:
      • 如果是一个整数 N,那么会沿着轴将序列均等分成 N 等份。如果不能均分则会报错。
      • 如果是一个序列,那么就会按照序列中的位置来划分。

    插入

    numpy.insert(arrobjvaluesaxis=None)
    • obj:定义了插入的位置(插入到哪里的前面)
      • 可以是整数,也可以是一个序列
    • values:插入的值

    沿指定轴获取数据

    numpy.take_along_axis(arrindicesaxis)
    • indices:和 arr 保持维度相同
    • axis:沿 arr 的哪条轴获取数据

    增加维度

    numpy.expand_dims(aaxis)
    在指定轴上增加一个维度,即指定轴之前的轴不动,指定轴及以后的轴整体右移。

    二分查找

    numpy.searchsorted(avside='left'sorter=None)
    在排好序的数组 a 中查找一个位置,使得假如把 v 插入在在这个位置之前,那么 a 数组的顺序不变。
    notion image

    生成网格格点

    numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')
    用于生成坐标网格。它接收多个一维数组作为输入,并返回坐标矩阵,以便在多维空间中进行计算或绘图。通常用于可视化、曲面绘制或多维插值等场景。
    参数:
    • xi:要生成网格的输入数组。可以是两个或更多个一维数组。
    • copy:默认为True,表示返回的数组是输入数组的副本。如果设为False,则返回的是视图。
    • sparse:默认为False。如果设为True,返回的是稀疏网格,这在高维数组中有助于节省内存。
    • indexing:指定输出的坐标矩阵的索引方式。可以是'xy''ij'
      • 'xy':适用于二维网格,生成的第一个数组代表x轴,第二个数组代表y轴。
      • 'ij':适用于笛卡尔坐标系,生成的坐标矩阵与输入数组的形状一致。
     

    SciPy 用法积累

    卷积

    scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)
    • input:输入图像
    • weights:卷积核
    • mode:{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’}, optional
      • ‘reflect’ (d c b a | a b c d | d c b a)
      • ‘constant’ (k k k k | a b c d | k k k k)
      • ‘nearest’ (a a a a | a b c d | d d d d)
      • ‘mirror’ (d c b | a b c d | c b a)
      • ‘wrap’ (a b c d | a b c d | a b c d)
    • cval:如果 mode 设置成 constant,那么 cval 表示常数具体是多少

    高斯滤波

    scipy.ndimage.gaussian_filter(input, sigma, order=0, output=None, mode='reflect', cval=0.0, truncate=4.0, *, radius=None, axes=None)
    • input:输入图像
    • sigma:高斯滤波的方差
    • order(很重要):高斯滤波的阶数,阶数为 0 表示和高斯核进行卷积,阶数为正数表示和高斯核对应阶数的导数卷积。
    • mode:同上
    • truncate:和 radius 相对,truncate 设定了高斯滤波截断的标准差
    • radius:高斯核的大小,设定了 radius,就会忽略 truncate
    返回:对输入图像进行高斯滤波后的结果

    Sobel 滤波

    scipy.ndimage.sobel(input, axis=-1, output=None, mode='reflect', cval=0.0)
    • axis:输入图像的哪条轴需要被计算,默认为 -1.
    • 其他参数同上。

    最大值滤波

    scipy.ndimage.maximum_filter(input, size=None, footprint=None, output=None, mode='reflect', cval=0.0, origin=0, *, axes=None)
    • footprint & size:footprint 和 size 至少设定一个
      • size 设定了窗口大小
      • footprint 用 bool 数组规定了取哪些数字。
        • size = (n, m) 和 footprint = np.ones((n, m)) 是等效的。
    • 其他参数同上。

    计算 n 维空间的点的距离

    scipy.spatial.distance.cdist(XA, XB, metric='euclidean', *, out=None, **kwargs)
    • XA: 的数组,表示 n 维空间的一组 m 个观测点。
    • XB: 的数组
    • metric:衡量距离的方法,默认为欧几里得距离。
    返回值
    一个 mA × mB 的距离矩阵。

    RQ 分解

    scipy.linalg.rq(aoverwrite_a=Falselwork=Nonemode='full'check_finite=True)
    执行 RQ 分解,R 为上三角矩阵,Q 为正交矩阵。
     
    生成模型小结多模态学习期中复习
    Loading...