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

APR*_*APR 17 python numpy

为什么这个程序

import numpy as np

c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)
Run Code Online (Sandbox Code Playgroud)

(2,)
(1,2)
Run Code Online (Sandbox Code Playgroud)

作为其输出?不应该

(1,2)
(1,2)
Run Code Online (Sandbox Code Playgroud)

代替?我在python 2.7.3和python 3.2.3中都得到了这个

Pie*_* GM 16

当您调用a的.shape属性时ndarray,您将获得一个元素,其元素与数组的维度一样多.长度,即行数,是第一个维度(shape[0])

  • 你从数组开始:c=np.array([1,2]).这是一个普通的1D数组,因此它的形状将是1元素元组,并且shape[0]是元素的数量,所以c.shape = (2,)
  • 考虑c=np.array([[1,2]]).这是一个2D阵列,有1行.第一行也是唯一一行[1,2],它给了我们两列.因此,c.shape=(1,2)len(c)=1
  • 考虑c=np.array([[1,],[2,]]).另一个2D数组,有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).

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

  • 我真的没有一个有用的评论,但我觉得有必要说......这有点因为某些原因而烦我... (3认同)

And*_*den 1

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

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

笔记:

c.transpose()
# array([1, 2])
Run Code Online (Sandbox Code Playgroud)

事实并非如此d,因此这种行为并不不一致。

dt = d.transpose()
# array([[1],
#        [2]])
dt.shape # (2,1)
Run Code Online (Sandbox Code Playgroud)