numpy - Z[[1, 2],[1]] 与 Z[(1,2),(1)] 完全相同吗?

numpy - is Z[[1, 2],[1]] completely same with Z[(1,2),(1)]?

根据 , now understood comma can trigger advanced indexing 的回答,文档中也有警告。

Warning The definition of advanced indexing means that x[(1,2,3),] is fundamentally different than x[(1,2,3)]. The latter is equivalent to x[1,2,3] which will trigger basic selection while the former will trigger advanced indexing. Be sure to understand why this occurs.

一旦高级索引用逗号触发,元组索引与数组索引相同吗?如果是这样,为什么有两种方法可以做到这一点?

如果不是,请帮助理解原因和背后的 rational/decision 来破译 numpy 行为。

Z = np.arange(12).reshape(3, 4)
print("Z is \n{}\n".format(Z))

print("Z[[1, 2],[1]] is \n{} Is view {}\n__array_interface__ {}\n".format(
    Z[
        [1,2],
        [1]
    ],
    Z[[1,2],[1]].base is not None,
    Z[[1,2],[1]].__array_interface__
))

# Comparison with tuple indexing
print("Z[(1,2),(1)] is \n{} Is view {}\n__array_interface__ {}\n".format(
    Z[
        (1,2),
        (1)
    ],
    Z[(1,2),(1)].base is not None,
    Z[(1,2),(1)].__array_interface__
))
---
Z is 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

Z[[1, 2],[1]] is 
[5 9] Is view False
__array_interface__ {'data': (94194177532720, False), 'strides': None, 'descr': [('', '<i8')], 'typestr': '<i8', 'shape': (2,), 'version': 3}

Z[(1,2),(1)] is 
[5 9] Is view False
__array_interface__ {'data': (94194177118656, False), 'strides': None, 'descr': [('', '<i8')], 'typestr': '<i8', 'shape': (2,), 'version': 3}
Z[[1, 2],[1]]

使用列表 [1,2] 索引第一个维度,使用列表 [1] 索引第二个维度。实际上 np.array([1,2]) 的索引是针对 np.array([1]) 广播的。所以它是来自第 1 行和第 2 行以及第 1 列的 2 个元素。

Z[(1,2),(1)]

也是一样。两者都有一个逗号创建一个传递给 __getitem__ 方法的外部元组。 np.array((1,2))np.array([1,2]) 相同。 (1) 不是元组,它只是 1 (没有逗号)。同样,第 1 行和第 2 行,第 1 列。

Z[(x,y)]等同于Z[x,y];构成元组的是逗号,而不是 ().

x[(1,2,3),]

逗号创建一个元组 ((1,2,3),),实际上告诉 x.__getitem__ 我们从 x 的第一个维度中选择。 x[[1,2,3],]x[np.array([1,2,3]),]是一样的。

x[(1,2,3)]

等同于x[1,2,3],为x.

的3个维度提供标量索引