NumPy的ndarray形状有三个参数

5
我可以帮忙翻译中文。以下是需要翻译的内容:

当提供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的矩阵。


1
这里令人困惑的是第一维,因为你不容易看到维度为一的情况。如果你使用(2,3,4)进行尝试,你会立即看到差异。你可以随时使用 array.shape 测试你的numpy数组。 - Mr. T
1
计算括号-3组,而不是2组。它们传达了有关数组形状的真实信息。 - hpaulj
3个回答

7
不,形状是不同的,需要注意方括号
>>> np.zeros((2, 1, 3))
array([<b>[</b>[ 0.,  0.,  0.]<b>]</b>,

       <b>[</b>[ 0.,  0.,  0.]<b>]</b>])

对比:

>>> np.zeros((1, 2, 3))
array([<b>[</b>[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]<b>]</b>])

正如你所见,在第一次调用中,我们在第二个维度有两次方括号成对出现,而在后者中,我们只有一个这样的括号对。

形状也不同:

>>> np.zeros((2, 1, 3)).shape
(2, 1, 3)
>>> np.zeros((1, 2, 3)).shape
(1, 2, 3)

因此,在前者中,我们有一个包含两个子列表的列表。每个子列表都包含一个元素:一个由三个元素组成的列表。在后者中,我们有一个包含一个元素的列表:一个具有两个元素的子列表,这两个元素都是由三个元素组成的列表。

因此,一个“香草Python”列表等价于:

[ [ [0, 0, 0] ], [ [0, 0, 0] ] ]

对比:

[ [ [0, 0, 0], [0, 0, 0] ] ]

2
根据 numpy.zeros 文档,第一个参数是表示数组形状的序列或整数。
如果您仔细观察,嵌套的方括号会随着所构建的形状而有所不同。
以下示例可能会更清晰地说明此问题:
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.]]])

2

dim=1只是一个无用的维度,你可以将一个2x3的矩阵视为1x2x3的张量。

然而,从技术上讲,它们并不是完全相同的东西。因此,你可以看到输出中的括号[]并不完全相同,无用维度的[]位置不在同一位置。

要去除无用维度,请使用

arr = np.squeeze(arr)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接