numpy.shape给出了不一致的回答 - 为什么?

时间:2012-09-30 22:48:44

标签: python numpy

为什么程序

import numpy as np

c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)

(2,)
(1,2)

作为输出?不应该是

(1,2)
(1,2)

代替?我在python 2.7.3和python 3.2.3

中得到了这个

4 个答案:

答案 0 :(得分:16)

当您调用.shape的{​​{1}}属性时,您会得到一个元组,其元素与数组的维度一样多。长度(即行数)是第一个维度(ndarray

  • 您从数组开始:shape[0]。这是一个普通的1D数组,因此它的形状将是1个元素的元组,c=np.array([1,2])是元素的数量,因此shape[0]
  • 考虑c.shape = (2,)。这是一个2D阵列,有1行。第一行也是唯一一行是c=np.array([[1,2]]),它为我们提供了两列。因此,[1,2]c.shape=(1,2)
  • 考虑len(c)=1。另一个2D数组,包含2行,1列:c=np.array([[1,],[2,]])c.shape=(2,1)
  • 考虑len(c)=2:此数组与d=np.array([[1,],[2,]]).transpose()相同,因此其形状为np.array([[1,2]])

另一个有用的属性是(1,2):这是所有维度中元素的数量,而您拥有数组.size c

有关documentation中的形状的更多信息。

答案 1 :(得分:1)

len(c.shape)是数组的“深度”。

对于c,数组只是一个列表(向量),深度为1 对于d,数组是列表列表,深度为2。

注意:

c.transpose()
# array([1, 2])

不是d,所以这种行为并不矛盾。

dt = d.transpose()
# array([[1],
#        [2]])
dt.shape # (2,1)

答案 2 :(得分:1)

快速修复:检查.ndim属性 - 如果是2,则.shape属性将按预期工作。

原因原因:如果.ndim属性为2,则numpy会报告与约定一致的形状值。如果.ndim属性为1,那么numpy只会以不同的方式报告形状。

更多说话:当您传递np.array列表时,.shape属性将符合矩阵维度的标准概念:(行,列)。

如果你传递np.array只是一个列表,那么numpy并不认为它有一个矩阵,并以不同的方式报告形状。

问题是:numpy认为它有一个矩阵,还是认为它有其他东西。

答案 3 :(得分:0)

transpose不会更改数组的维数。如果c.ndim == 1c.transpose() == c。尝试:

c = np.array([1,2])
print c.shape
print c.T.shape
c = np.atleast_2d(c)
print c.shape
print c.T.shape