为什么程序
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
中得到了这个答案 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 == 1
,c.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