强基初中数学&学Python——第227课 数字和数学第三方模块NumPy:菜鸟入门(3)


数组的形状和大小

  本节介绍ndarray.ndim、ndarray.size和ndarray.shape属性。

  ndarray.ndim:数组的轴数或维度。

  ndarray.size:数组的元素总数,数组形状元素的乘积。

  ndarray.shape:用一个整数元组显示数组每个维度上存储的元素数。例如,如果您有一个2行3列的二维阵列,则数组的形状为(2, 3)。

  例如,如果创建下面一个数组:

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

显示该数组的维度,执行:

>>> array_example.ndim
3

显示该数组的元素个数,执行:

>>> array_example.size
24

显示该数组的形状,执行:

>>> array_example.shape
(3, 2, 4)

数组的重塑

  数组对象方法arr.reshape()

  使用arr.reshape()在不更改数据的情况下为数组赋予新形状。请记住,当使用重塑方法时,新数组必须与原数组的长度(size,元素数量)相同。如果原数组有12个元素,则新数组也是12个元素。

  比如下面的数组:

>>> a = np.arange(6)
>>> print(a)
[0 1 2 3 4 5]

可以使用reshape()来重塑数组。例如,可以将此数组重塑为具有三行两列的数组副本:

 

  除了对象reshape()方法外,还可以用模块np.reshape()函数,它可以指定一些参数:

>>> np.reshape(a, newshape=(1, 6), order='C')
array([[0, 1, 2, 3, 4, 5]])

  a:待重塑的数组。

  newshape:新形状,可以是整数或整数元组。如果指定整数,结果将是该长度的一维数组。形状应与原始形状兼容(元素个数相同)。

 

 

  order:索引顺序C表示采用C语言索引顺序读/写元素,F表示采用Fortran语言(数学计算专业编程语言)索引顺序读写元素,A表示如果a数组在内存中是Fortran连续储存的,则按Fortran语言索引顺序读/写,否则按C语言顺序。(这是一个可选参数,并不一定要指定。)

 

  如果您想了解有关CFortran顺序的更多信息,可以在这里(https://numpy.org/doc/stable/dev/internals.html#numpy-internals)阅读有关NumPy数组内部组织的更多信息。

  从本质上讲,CFortran索引顺序与数组在内存中的存储顺序有关。在Fortran语言中,对于二维数组,一列中相邻的元素在内存中也相邻,这是Fortran被认为是列主语言(Column-major language)的原因。然而,在C语言中,对于二维数组,一行中相邻的元素在内存中也相邻,相应的就把它称为行主语言(Row-major language)。至于采用何种方式并不重要,重要的是保留索引顺序方式或不对数据重新排序。

  在此处(https://numpy.org/doc/stable/user/quickstart.html#quickstart-shape-manipulation)了解有关形状操纵的更多信息。

 

 

1D数组变2D/往数组添加新轴(维)

  包括np.newaxis和np.expand_dims。

  使用np.newaxisnp.expand_dims以增加现有数组的维数。

  每使用一次np.newaxis会使数组升高一个维度。就是1D数组变2D数组,2D数组变成3D数组,依此类推。

  例如,数组:

>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> a.shape
(6,)

可以用np.newaxis升高一个维度:

>>> a2 = a[np.newaxis, :]
>>> a2.shape
(1, 6)

注:a[:]是复制数组,冒号前加入特殊参数np.newaxis。

  可以使用np.newaxis显式转换具有行向量或列向量的1D数组。例如,可以通过沿第一维度插入轴将1D数组转换为行向量:

>>> row_vector = a[np.newaxis, :]
>>> row_vector.shape
(1, 6)

或者,插入第二轴转化为列向量:

>>> col_vector = a[:, np.newaxis]
>>> col_vector.shape
(6, 1)

  还可以使用np.expand_dims在指定位置插入新轴来扩展数组。

  例如,数组:

>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> a.shape
(6,)

使用np.expand_dims在索引位置1处添加轴:

>>> b = np.expand_dims(a, axis=1)
>>> b.shape
(6, 1)

也可以在索引0处添加轴:

>>> c = np.expand_dims(a, axis=0)
>>> c.shape
(1, 6)

  有关newaxis更多信息打开https://numpy.org/doc/stable/reference/arrays.indexing.html#arrays-indexing;和expand_dims的打开https://numpy.org/doc/stable/reference/generated/numpy.expand_dims.html#numpy.expand_dims。