numpy ndarray形状有什么作用?

时间:2017-11-30 01:28:34

标签: arrays numpy multidimensional-array shape numpy-ndarray

我对.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 个答案:

答案 0 :(得分:33)

yourarray.shapenp.shape()np.ma.shape()会将您的ndarray的形状作为元组返回;您可以使用yourarray.ndimnp.ndim()来获取数组的维度。

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

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

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

这是遵循以下惯例:

对于1D数组,返回仅带 1 元素的形状元组(即(n,)
对于2D数组,仅返回 2个元素的形状元组(即(n,m)
对于3D阵列,仅返回 3 元素(即(n,m,k))的形状元组 对于4D数组,返回仅包含 4 元素的形状元组(即(n,m,k,j)

等等。

另外,请参阅下面的示例,了解np.shape()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。:所以,形状元组与我们对空间维度的理解一致,至少在数学上是这样。

答案 1 :(得分:3)

与其最受欢迎的商业竞争对手不同,numpy几乎从一开始就是关于&#34;任意维度&#34;数组,这就是核心类被称为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中的1d数组确实是1d,没有行或列。

如果你想要一个像行或列向量的东西你可以通过创建一个维度等于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

答案 2 :(得分:1)

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

例如: 一维阵列:

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

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

2D阵列:

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

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

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

答案 3 :(得分:0)

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

enter image description here