为什么程序
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 中都得到了这个
当您调用.shape
a 的属性时ndarray
,您会得到一个包含与数组维度一样多的元素的元组。长度,即行数,是第一个维度(shape[0]
)
c=np.array([1,2])
。这是一个普通的一维数组,所以它的形状将是一个 1 元素元组,并且shape[0]
是元素的数量,所以c.shape = (2,)
c=np.array([[1,2]])
。这是一个二维数组,有 1 行。第一行也是唯一的一行是[1,2]
,它给了我们两列。因此,c.shape=(1,2)
和len(c)=1
c=np.array([[1,],[2,]])
。另一个二维数组,有 2 行 1 列:c.shape=(2,1)
和len(c)=2
.d=np.array([[1,],[2,]]).transpose()
:这个数组与 相同np.array([[1,2]])
,因此它的形状是(1,2)
。另一个有用的属性是.size
:这是所有维度中元素的数量,你有一个数组c
c.size = np.product(c.shape)
。
有关文档中形状的更多信息。
len(c.shape)
是数组的“深度”。
对于c
,数组只是一个列表(向量),深度为 1。
对于d
,数组是列表的列表,深度为 2。
笔记:
c.transpose()
# array([1, 2])
不是d
,所以这种行为并不矛盾。
dt = d.transpose()
# array([[1],
# [2]])
dt.shape # (2,1)
快速修复:检查 .ndim 属性 - 如果它是 2,那么 .shape 属性将按预期工作。
原因:如果 .ndim 属性为 2,则 numpy 报告符合约定的形状值。如果 .ndim 属性为 1,那么 numpy 只会以不同的方式报告形状。
更多讨论:当您传递 np.array 列表列表时, .shape 属性将与矩阵维度的标准概念一致:(行,列)。
如果你传递 np.array 只是一个列表,那么 numpy 认为它手上没有矩阵,并以不同的方式报告形状。
问题是:numpy 是否认为它有一个矩阵,或者它是否认为它手上有其他东西。
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
来自Matlab,我也发现很难将一维数组组织为(row_count,colum_count)
我的函数必须对像 [x1, x2, x3] 这样的一维 ndarray 或数组列表 [[x1, x2, x3], [x1, x2, x3], [x1, x2, x3]] 做出一致的响应.
这对我有用:
dim = np.shape(subtract_matrix)[-1]
选择最后一个维度。