当提供3个参数时,我对ndarray的形状感到困惑:
例如,有什么区别:
np.zeros((2, 1, 3))
array([[[ 0., 0., 0.]],
[[ 0., 0., 0.]]])
和:
np.zeros((1, 2, 3))
array([[[ 0., 0., 0.],
[ 0., 0., 0.]]])
在我看来,它们都代表2 * 3矩阵。
答案 0 :(得分:5)
不,形状不同,你必须注意方括号:
>>> np.zeros((2, 1, 3))
array([[[ 0., 0., 0.]],
[[ 0., 0., 0.]]])
与
>>> np.zeros((1, 2, 3))
array([[[ 0., 0., 0.],
[ 0., 0., 0.]]])
正如你所看到的,在第一次调用中,我们有两次方括号用于第二个维度,而在后者中,我们只有一个这样的对。
形状也不同:
>>> np.zeros((2, 1, 3)).shape
(2, 1, 3)
>>> np.zeros((1, 2, 3)).shape
(1, 2, 3)
所以在前者中我们有一个包含两个子列表的列表。这些子列表中的每一个都包含一个元素:三个元素的列表。在后者中,我们有一个包含一个元素的列表:一个包含两个元素的子列表,这两个元素是包含三个元素的列表。
所以 vanilla Python 列表等价物是:
[ [ [0, 0, 0] ], [ [0, 0, 0] ] ]
与
[ [ [0, 0, 0], [0, 0, 0] ] ]
答案 1 :(得分:2)
dim = 1只是一个愚蠢的维度,你总是可以将2x3
的矩阵视为1x2x3
的张量。
然而,它们在技术上并不是一回事。因此,您可以看到2输出中的括号[]
不完全相同,dumb维度的[]
位置不在同一位置。
要删除哑尺寸,请使用
arr = np.squeeze(arr)
答案 2 :(得分:2)
根据numpy.zeros
documentation,第一个参数是表示数组形状的序列或int。
如果仔细观察,嵌套的方括号与您构建的形状不一致。
这个例子可能会更清楚:
np.zeros((2, 3, 4))
array([[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]],
[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]])