59

我有一个关于 .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),一行三列,对吧?

4

4 回答 4

82

yourarray.shapenp.shape()np.ma.shape()将您的 ndarray 的形状作为元组返回;您可以使用yourarray.ndimor获取数组的(数量)维度np.ndim()。(即它给出了nof the,ndarray因为 NumPy 中的所有数组都只是 n 维数组(简称为ndarrays))

对于一数组,形状将是数组(n,)n元素的数量。

对于二维数组,形状将是(n,m)其中n的行数和m数组中的列数。

请注意,在1D情况下,形状将简单地(n, )代替您所说的(1, n)或者(n, 1)分别用于行和列向量。

这是为了遵循以下约定:

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

等等。

此外,请参阅下面的示例以了解一维数组和标量的方式np.shape()np.ma.shape()行为:

# 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

PS:所以,形状元组与我们对空间维度的理解是一致的,至少在数学上是这样。

于 2017-11-30T01:44:18.753 回答
5

与它最流行的商业竞争对手不同,numpy 从一开始就是关于“任意维”数组的,这就是为什么核心类被称为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 数组恰好是 2d 像你的第二个例子,那么从行和列的角度来考虑它是合适的。但是 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
于 2017-11-30T01:49:19.267 回答
4
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

在此处输入图像描述

于 2020-04-20T14:54:40.307 回答
1

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

例如:一维数组:

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) 即行数和列数。

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

于 2019-10-02T03:57:40.173 回答