🚗Numpy 学习笔记
type
status
date
slug
summary
tags
category
icon
password
基础知识数组创建打印数组基本操作常用方法通过指定axis参数,可以沿数组的指定轴应用操作。通函数索引、切片和迭代形状操纵拷贝完全不复制浅拷贝(视图)深拷贝花式索引使用索引数组进行索引使用布尔数组进行索引线性代数用法积累向量的范数allclosevstack、hstack和column_stackpad限制最大值和最小值改变数组的类型生成正态分布生成随机整数标准差平均值最小值的下标将满足条件的元素设定为某个值将函数向量化分割数组插入沿指定轴获取数据增加维度二分查找生成网格格点SciPy 用法积累卷积高斯滤波Sobel 滤波最大值滤波计算 n 维空间的点的距离RQ 分解
基础知识
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),步长为5np.linspace(0, 2, 9)
9个数等距分布,第一个是0,最后一个是2打印数组
当您打印数组时,NumPy以与嵌套列表类似的方式显示它,但具有以下布局:
- 最后一个轴从左到右打印,
- 倒数第二个从上到下打印,
- 其余部分也从上到下打印,每个切片用空行分隔。
然后将一维数组打印为行,将二维数据打印为矩阵,将三维数据打印为矩数组表。
如果数组太大,Numpy会自动跳过数组的中心部分并只打印角点。要禁用此行为并强制Numpy打印整个数组,可以:
np.set_printoptions(threshold=sys.maxsize)
基本操作
相同大小的矩阵可以进行加减乘除运算。
数学中的矩阵乘积可以使用
@
运算符或dot
函数执行A @ B
或A.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
的第一维。同样,我们也可以为多个维度提供索引。每个维度的索引数组必须具有相同的形状。
还可以将
i
与j
数组放入列表中进行索引。可以使用数组索引作为“左值”。
使用布尔数组进行索引
思想:指定哪些是我们想要的元素
最简单的情况是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(
ary
,
indices_or_sections
,
axis=0
)
- indices_or_sections:
- 如果是一个整数 N,那么会沿着轴将序列均等分成 N 等份。如果不能均分则会报错。
- 如果是一个序列,那么就会按照序列中的位置来划分。
插入
numpy.insert(
arr
,
obj
,
values
,
axis=None
)
- obj:定义了插入的位置(插入到哪里的前面)
- 可以是整数,也可以是一个序列
- values:插入的值
沿指定轴获取数据
numpy.take_along_axis(
arr
,
indices
,
axis
)
- indices:和 arr 保持维度相同
- axis:沿 arr 的哪条轴获取数据
增加维度
numpy.expand_dims(
a
,
axis
)
在指定轴上增加一个维度,即指定轴之前的轴不动,指定轴及以后的轴整体右移。
二分查找
numpy.searchsorted(
a
,
v
,
side='left'
,
sorter=None
)
在排好序的数组 a 中查找一个位置,使得假如把 v 插入在在这个位置之前,那么 a 数组的顺序不变。
生成网格格点
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(
a
,
overwrite_a=False
,
lwork=None
,
mode='full'
,
check_finite=True
)
执行 RQ 分解,R 为上三角矩阵,Q 为正交矩阵。