数组的形状和大小
本节介绍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语言顺序。(这是一个可选参数,并不一定要指定。)
如果您想了解有关C和Fortran顺序的更多信息,可以在这里(https://numpy.org/doc/stable/dev/internals.html#numpy-internals)阅读有关NumPy数组内部组织的更多信息。
从本质上讲,C和Fortran索引顺序与数组在内存中的存储顺序有关。在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.newaxis和np.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。