根据numpy documentation,将数组索引指定为array_name[x, y]
和array_name[x][y]
是等效的,并且应产生相同的结果。但是,以下代码段:
import numpy as np
a = np.empty((7, 8, 9), dtype = object)
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
产生输出:
(7,) (8,) (9,)
(9,) (9,) (9,)
分别显然不相等。有什么作用?
答案 0 :(得分:1)
您误解了numpy如何解释索引/切片。对于类似a[x, y, z]
的事物,numpy使用x
沿第一个维度进行选择,y
沿第二个维度进行选择,z
沿第三个维度进行选择。
但是,对于类似a[x][y][z]
的事物,numpy在x
的第一维上使用a
,而在y
的第一维上使用a[x]
,和z
沿a[x][y]
的第一个维度。
如果您将:
与某个数字进行比较,可能会造成混淆。为什么会这样呢?一种是切片(:
),另一种是索引(no :
)。因为沿维切片(使用:
)实际上并不能减小数组的维数,而索引却可以。
可能有很多例子可以表示这一点,但是我认为最好在具有数组的ipython中玩,看看不同的索引和切片如何影响输出。但是,我将提供一两个示例专门回答您的问题
import numpy as np
a = np.arange(2*3*4).reshape((2,3,4))
a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Prints (2,) (3,), (4,)
打破这一点,我们采取每一个:
a[:, 0, 0]
包含所有第一个维度,而第0
个元素则包含第二个和第三个维度。a[0, :, 0]
接受第一个维度的第0
个元素,所有第二个维度以及第三个维度的第0
个元素。a[0, 0, :]
在第一个维度和第二个维度中使用第0
个元素,在第三个维度中使用所有元素。# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
# Prints (4,) (4,) (4,)
在这种情况下:
a[:]
与a
基本相同(返回矩阵的新view
-谷歌“ numpy视图”以获取更多信息)。由于a[:]
与a
相同,因此a[:][0]
选择0
a
元素 >
OP说:
根据numpy documentation,将数组索引指定为array_name [x,y]和array_name [x] [y]是等效的
这是真的!要认识的主要事情是(尽管相关)索引编制和切片不是同一件事(正如我上面指出的那样)。