numpy ndarray 形状有什么作用?

what does numpy ndarray shape do?

我有一个关于 .shape 函数的简单问题,这让我很困惑。

a = np.array([1, 2, 3])   # Create a rank 1 array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3,)"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                     # Prints "(2, 3)"

.shape 到底做了什么?计算多少行,多少列, 那么a.shape应该是,(1,3),一行三列,对吧?

yourarray.shape or np.shape() or np.ma.shape() returns the shape of your ndarray as a tuple; And you can get the (number of) dimensions of your array using yourarray.ndimnp.ndim()。 (即它给出 ndarrayn 因为 NumPy 中的所有数组都只是 n 维数组(简称为 ndarrays))

对于 1D 数组,形状为 (n,),其中 n 是数组中元素的数量。

对于 2D 数组,形状为 (n,m) 其中 n 是行数,m 是行数数组中的列。

请注意,在 1D 的情况下,形状将只是 (n, ) 而不是您所说的 (1, n)(n, 1)分别用于行向量和列向量。

这是遵循以下约定:

对于一维数组,return 一个 形状元组 只有 1 个元素(即 (n,)
对于二维数组,return 一个 形状元组 只有 2 个元素(即 (n,m)
对于 3D 数组,return 一个 形状元组 只有 3 个元素(即 (n,m,k)
对于 4D 数组,return 一个 形状元组 只有 4 个元素(即 (n,m,k,j)

等等。

此外,请参阅下面的示例,了解 np.shape() or np.ma.shape() 如何处理 1D 数组和标量:

# sample array
In [10]: u = np.arange(10)

# get its shape
In [11]: np.shape(u)    # u.shape
Out[11]: (10,)

# get array dimension using `np.ndim`
In [12]: np.ndim(u)
Out[12]: 1

In [13]: np.shape(np.mean(u))
Out[13]: ()       # empty tuple (to indicate that a scalar is a 0D array).

# check using `numpy.ndim`
In [14]: np.ndim(np.mean(u))
Out[14]: 0

P.S.:因此,形状元组 一致我们对 space 维度的理解,至少在数学上是这样。

与其最受欢迎的商业竞争对手不同,numpy 从一开始就几乎是关于 "arbitrary-dimensional" 数组的,这就是核心 class 被称为 ndarray 的原因。您可以使用 .ndim 属性 检查 numpy 数组的维数。 .shape 属性 是一个长度为 .ndim 的元组,其中包含每个维度的长度。目前,numpy 最多可以处理 32 个维度:

a = np.ones(32*(1,))
a
# array([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ 1.]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
a.shape
# (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a.ndim
# 32

如果一个 numpy 数组恰好像你的第二个例子一样是二维的,那么从行和列的角度来考虑它是合适的。但是 numpy 中的一维数组是真正的一维数组,没有行或列。

如果您想要行向量或列向量之类的东西,您可以通过创建一个维度等于 1 的二维数组来实现。

a = np.array([[1,2,3]]) # a 'row vector'
b = np.array([[1],[2],[3]]) # a 'column vector'
# or if you don't want to type so many brackets:
b = np.array([[1,2,3]]).T

.shape() 根据其中的元素数量给出数组的实际形状,即 rows/No 的列数。 你得到的答案是元组的形式。

例如: 一维数组:

d=np.array([1,2,3,4])
print(d)
(1,)

输出:(4,) 即数字4表示一维数组中元素的数量。

二维数组:

e=np.array([[1,2,3],[4,5,6]])   
print(e)
(2,3)

输出:(2,3)即行数和列数。

最终输出中的元素数量将取决于数组中的行数....它会逐渐增加。

array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])