阵列

“NumPy”杂志 array 是让NumPy变得如此方便和高效的底层机制。

创建阵列

一个NumPy array 很容易通过以下方式进行初始化

>>> np.array([0, 1, 2])  # 1D array of integers
array([0, 1, 2])
>>> np.array([0.0, 1.0, 2.0])  # 1D array of floats
array([ 0.,  1.,  2.])
>>> np.array([[0, 1], [2, 3]])  # 2D array of integers
array([[0, 1],
       [2, 3]])

因此,通过嵌套数字列表,您可以构造多维数组。但也有其他方法可以初始化 arrays

  • numpy.zeros()

    >>> np.zeros(3)
    array([ 0.,  0.,  0.])
    >>> np.zeros([2, 3])
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
  • numpy.zeros()

    >>> np.ones(3)
    array([ 1.,  1.,  1.])
    >>> 3 * np.ones(3)
    array([ 3.,  3.,  3.])
    >>> np.ones([2, 3])
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    
  • numpy.eye()

    >>> np.eye(2)
    array([[ 1.,  0.],
           [ 0.,  1.]])
    >>> -2 * np.eye(2)
    array([[-2., -0.],
           [-0., -2.]])
    
  • numpy.arange() :这个人应该觉得很熟悉 range 普通 Python 的。但是在后者只能处理整数的情况下,NumPy的实现也可以处理浮点数。

    >>> np.arange(5)
    array([0, 1, 2, 3, 4])
    >>> np.arange(3, 7)
    array([3, 4, 5, 6])
    >>> np.arange(2, 4, 0.5)
    array([ 2. ,  2.5,  3. ,  3.5])
    
  • numpy.linspace() :如果需要均匀分布的样本,这种初始化方式比 numpy.arange() 这是由于后者引入了由实现引起的轻微舍入误差。

    >>> np.linspace(0, 4, 5)
    array([ 0.,  1.,  2.,  3.,  4.])
    >>> np.linspace(0.3, 0.7, 5)
    array([ 0.3,  0.4,  0.5,  0.6,  0.7])
    >>> np.linspace(0.3, 0.7, 4, endpoint=False)
    array([ 0.3,  0.4,  0.5,  0.6])
    

数组属性

这个 arrays 还提供了一些关于其自身的信息,这些信息可以通过其属性进行访问。

维数

这个 ndim 属性是数组的维数。

>>> x = np.array([0.0, 1.0, 2.0])
>>> x.ndim
1
>>> x = np.array([[0, 1, 2], [3, 4, 5]])
>>> x.ndim
2

形状

这个 shape 属性是表示沿每个维度的元素数量的元组。

>>> x = np.array([0.0, 1.0, 2.0])
>>> x.shape
(3,)
>>> x = np.array([[0, 1, 2], [3, 4, 5]])
>>> x.shape
(2, 3)
>>> x.shape[0]
2
>>> x.shape[1]
3

大小

这个 size 属性是数组的元素数量。

>>> x = np.array([0.0, 1.0, 2.0])
>>> x.size
3
>>> x = np.array([[0, 1, 2], [3, 4, 5]])
>>> x.size
6

所以从本质上说,它是 shape

访问数据

类似于 liststuples 通过引用索引访问数据:

>>> x = np.array([[0, 1, 2],
...               [3, 4, 5]])
>>> x[0, 0]
0
>>> x[0, 1]
1
>>> x[1, 0]
3
>>> x[1, 2]
5

切片

切片是指从数组中提取部分数据。这是非常高效的,因为不会在内存中复制任何内容。

>>> x = np.array([[0, 1, 2, 3, 4],
...               [5, 6, 7, 8, 9],
...               [10, 11, 12, 13, 14],
...               [15, 16, 17, 18, 19],
...               [20, 21, 22, 23, 24]])
>>> x[0, :]
array([0, 1, 2, 3, 4])
>>> x[1, :]
array([5, 6, 7, 8, 9])
>>> x[:, 1]
array([ 1,  6, 11, 16, 21])
>>> x[:3, :3]
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12]])
>>> x[2:, 2:]
array([[12, 13, 14],
       [17, 18, 19],
       [22, 23, 24]])

注解

数组的片共享原始数组的内存。因此,您对切片所做的所有更改也表示在原始数组中:

>>> x = np.array([[0, 1, 2, 3, 4],
...               [5, 6, 7, 8, 9],
...               [10, 11, 12, 13, 14],
...               [15, 16, 17, 18, 19],
...               [20, 21, 22, 23, 24]])
>>> print(x)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
>>> x_slice = x[1:-1, 1:-1]
>>> print(x_slice)
[[ 6  7  8]
 [11 12 13]
 [16 17 18]]
>>> x_slice[1, 1] = 888
>>> print(x_slice)
[[  6   7   8]
 [ 11 888  13]
 [ 16  17  18]]
>>> print(x)
[[  0   1   2   3   4]
 [  5   6   7   8   9]
 [ 10  11 888  13  14]
 [ 15  16  17  18  19]
 [ 20  21  22  23  24]]