简介

NumPy 的官方指导手册一定是最好的老师

Numpy 相当于增强版的 array,使用时往往先以简称引入:

import numpy as np

基础

属性

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)                   # 从 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)

有一些预先定义的函数,如 summaxmin 等,默认不考虑其形状,视为一串数字,可以使用 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]])

通用函数,如 sinsqrt 等,接受数组,生成数组,如 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
array([3., 7., 3., 4., 1., 4., 2., 2., 7., 2., 4., 9.])
>>> a.reshape(6, 2) # 修改形状
>>> a.reshape(6, -1) # 支持接受参数 -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)) # 与 reshape 类似,但是会修改 a
>>> 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.]])
>>> # 把 a 分成 3 份
>>> 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.]])]
>>> # 在第三列和第四列后分裂 a
>>> 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] # 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], # a 的第一维的索引
... [1, 2]])
>>> j = np.array([[2, 1], # a 的第二维的索引
... [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]])