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个维度提供标量索引
根据
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
.