简介
NumPy 的官方指导手册一定是最好的老师
Numpy 相当于增强版的 array,使用时往往先以简称引入:
基础
属性
Numpy 数组的类是 ndarray
,有以下属性:
名称 |
解释 |
ndarray.ndim |
数组的维度 |
size |
数组的元素数量,即 shape 的各元素乘积 |
shape |
返回一个 tuple,如对于 n 行 m 列的矩阵,返回 (n, m) |
创建数组
使用列表和 np.array
创建:
a = np.array([1, 2, 3, 4])
|
使用 zeros
创建全是 0 的数组,使用 ones
创建全是 1 的数组,默认为浮点类型,可以使用 dtype
参数指定类型:
>>> np.zeros((3, 4)) array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) >>> np.ones((3, 4), dtype=np.int16) array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]],dtype=int16)
|
arange
返回一个数字序列,类似于 python 中的 range
>>> np.arange(10, 30, 5) array([10, 15, 20, 25]) >>> np.arange(0, 2, 0.3) array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
|
因为很难预计浮点数的个数,所以可以用 linspace
显示指定数字个数:
>>> np.linspace(0, 2, 9) array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
|
基本操作
算术运算按元素使用,如
>>> a = np.array([20, 30, 40, 50]) >>> b = np.arange(4) >>> b array([0, 1, 2, 3]) >>> c = a - b >>> c array([20, 29, 38, 47]) >>> b**2 array([0, 1, 4, 9]) >>> 10 * np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]) >>> a < 35 array([ True, True, False, False])
|
矩阵乘法使用 .dot
或 @
,如 A @ B
或 `A.dot(B)
有一些预先定义的函数,如 sum
、max
、min
等,默认不考虑其形状,视为一串数字,可以使用 axis=
参数指定坐标轴:
>>> b = np.arange(12).reshape(3, 4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
>>> b.sum(axis=0) array([12, 15, 18, 21])
>>> b.min(axis=1) array([0, 4, 8])
>>> b.cumsum(axis=1) array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])
|
通用函数,如 sin
、sqrt
等,接受数组,生成数组,如 np.add(B, C)
更多函数:
all
, any
, apply_along_axis
, argmax
, argmin
, argsort
, average
, bincount
, ceil
, clip
, conj
, corrcoef
, cov
, cross
, cumprod
, cumsum
, diff
, dot
, floor
, inner
, invert
, lexsort
, max
, maximum
, mean
, median
, min
, minimum
, nonzero
, outer
, prod
, re
, round
, sort
, std
, sum
, trace
, transpose
, var
, vdot
, vectorize
, where
切片与索引
支持索引、切片、迭代
缺失的维度相当于使用了 :
,如对于二维数组 b[-1]
等价于 b[-1, :]
...
代表自动填充 :
,如对于五维数组 x[1, 2, ...]
等价于 x[1, 2, :, :, :]
想要迭代高维度的所有元素,使用 flat
,如 for element in b.flat:
形状操纵
改变形状
a.ravel() array([3., 7., 3., 4., 1., 4., 2., 2., 7., 2., 4., 9.]) >>> a.reshape(6, 2) >>> a.reshape(6, -1) array([[3., 7.], [3., 4.], [1., 4.], [2., 2.], [7., 2.], [4., 9.]]) >>> a.T array([[3., 1., 7.], [7., 4., 2.], [3., 2., 4.], [4., 2., 9.]]) >>> a.T.shape (4, 3) >>> a.resize((2, 6)) >>> a array([[3., 7., 3., 4., 1., 4.], [2., 2., 7., 2., 4., 9.]])
|
把不同数组堆叠到一起
>>> a array([[9., 7.], [5., 2.]]) >>> b array([[1., 9.], [5., 1.]]) >>> np.vstack((a, b)) array([[9., 7.], [5., 2.], [1., 9.], [5., 1.]]) >>> np.hstack((a, b)) array([[9., 7., 1., 9.], [5., 2., 5., 1.]])
|
column_stack
把一维数组作为列堆叠到二维数组中
分裂数组
a = np.floor(10 * rg.random((2, 12))) >>> a array([[6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.], [8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.]]) >>> >>> np.hsplit(a, 3) [array([[6., 7., 6., 9.], [8., 5., 5., 7.]]), array([[0., 5., 4., 0.], [1., 8., 6., 7.]]), array([[6., 8., 5., 2.], [1., 8., 1., 0.]])] >>> >>> np.hsplit(a, (3, 4)) [array([[6., 7., 6.], [8., 5., 5.]]), array([[9.], [7.]]), array([[0., 5., 4., 0., 6., 8., 5., 2.], [1., 8., 6., 7., 1., 8., 1., 0.]])]
|
类似的,也有 vsplit
进阶索引
用索引数组索引
a = np.arange(12)**2 >>> i = np.array([1, 1, 3, 8, 5]) >>> a[i] array([ 1, 1, 9, 64, 25])
>>> j = np.array([[3, 4], [9, 7]]) >>> a[j] array([[ 9, 16], [81, 49]])
|
如果是多维数组,则使用多维索引,如
a = np.arange(12).reshape(3, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> i = np.array([[0, 1], ... [1, 2]]) >>> j = np.array([[2, 1], ... [3, 3]]) >>> >>> a[i, j] array([[ 2, 5], [ 7, 11]])
|
在 python 中,arr[i, j]
和 arr[(i, j)]
等价
也可以使用索引数组赋值:
>>> a array([0, 1, 2, 3, 4]) >>> a[[1, 3, 4]] = 0 >>> a array([0, 0, 2, 0, 0])
|
用 Boolean 数组索引
可以用来筛选满足某些条件的值
a = np.arange(12).reshape(3, 4) >>> b = a > 4 >>> b array([[False, False, False, False], [False, True, True, True], [ True, True, True, True]]) >>> a[b] array([ 5, 6, 7, 8, 9, 10, 11]) >>> a[b] = 0 >>> a array([[0, 1, 2, 3], [4, 0, 0, 0], [0, 0, 0, 0]])
|