N维数组简介¶
是时候让我们了解NumPy——在Python中做数字工作的旗舰模组——了!以使用此模组,我们需要在代码中“导入”(import)NumPy模组:
import numpy as np
你也可以运行 import numpy
来代替以上语句,但是以上语句允许我们在代码中使用简写 ‘np’ 而不需要写出全称 ‘numpy’。这是一个常用的简写。
N维数组(ND-array)是NumPy模组的明星。它能够存储一序列的数字。像Python列表一样,你可以通过“索引”(indexing)来访问该数组的成员,也可以通过“切片”(slicing)来访问数组的子序列。那么NumPy的N维数组和Python列表有什么区别,且为什么有一整个围绕着这个数组的数字模组呢?N维数组特殊于以下两点。它可以:
提供在多个维度访问它内在数据的接口。
通过编译的C代码(而不是Python代码)高效地对其成员或有规律的子序列进行数学操作;这个过程叫做矢量化(vectorization)。
让我们扫一眼这个模组提供的内容吧。以下代码创建了一个内容为数字0-8的N维数组:
>>> import numpy as np
>>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
此对象属于NumPy定义的类 numpy.ndarray
。
# N维数组属于类 `numpy.ndarray`
>>> type(x)
numpy.ndarray
>>> isinstance(x, np.ndarray)
True
我们可以重塑(reshape)此数组的形状,使其可以在2个维度中被访问:
>>> x = x.reshape(3,3)
>>> x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
我们将使用NumPy的一个“矢量化”过的函数来为数组中每一个数都求平方(而不需要编写for循环):
>>> np.power(x, 2) # 也可以使用简写来计算:x**2
array([[ 0, 1, 4],
[ 9, 16, 25],
[36, 49, 64]], dtype=int32)
让我们求数据每一列的平均值:
>>> np.mean(x, axis=1)
array([ 1., 4., 7.])
我们可以使用广播来为 x
的每一列求多个不同的幂:
>>> x ** np.array([0., 1., 2.])
array([[ 1., 1., 4.],
[ 1., 4., 25.],
[ 1., 7., 64.]])
基本索引(basic indexing)允许我们获得 x
的多维度切片:
>>> x[:2, :3]
array([[0, 1, 2],
[3, 4, 5]])
进阶索引可以用来获取 x
中所有的偶数;让我们更新 x
来让它所有的偶数都乘以-1吧:
>>> x[x % 2 == 0] *= -1
>>> x
array([[ 0, 1, -2],
[ 3, -4, 5],
[-6, 7, -8]])
在本模组结尾,这些代码片段都将会成为你理解范围内,且NumPy的强大功能也将得到充分的展示。