18

为什么程序

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

5 回答 5

17

当您调用.shapea 的属性时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)

有关文档中形状的更多信息。

于 2012-10-01T07:48:57.767 回答
1

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

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

笔记:

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

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

dt = d.transpose()
# array([[1],
#        [2]])
dt.shape # (2,1)
于 2012-09-30T22:56:00.283 回答
1

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

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

更多讨论:当您传递 np.array 列表列表时, .shape 属性将与矩阵维度的标准概念一致:(行,列)。

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

问题是:numpy 是否认为它有一个矩阵,或者它是否认为它手上有其他东西。

于 2017-12-03T01:59:18.803 回答
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
于 2012-10-01T19:23:26.420 回答
0

来自Matlab,我也发现很难将一维数组组织为(row_count,colum_count)

我的函数必须对像 [x1, x2, x3] 这样的一维 ndarray 或数组列表 [[x1, x2, x3], [x1, x2, x3], [x1, x2, x3]] 做出一致的响应.

这对我有用:

dim = np.shape(subtract_matrix)[-1]

选择最后一个维度。

于 2021-10-15T12:15:11.287 回答