【发布时间】:2021-04-17 04:33:55
【问题描述】:
我一直在学习花式索引,但是当我观察到以下代码的行为时,我有几个问题......
据我了解,
Fancy Indexing 是:ndArray[ [0,1,2] ] 即传递行/列列表
和
切片是:ndArray[ 0:3 ] 即给出一系列行/列
现在,问题来了
一个numpy数组,
arr = [ [1,2,3],
[4,5,6],
[7,8,9] ]
当我尝试花式索引时:
arr[ [0,1], [1,2] ]
>>> [2, 6]
当切片时,
arr[:2, 1:]
>>> [ [2, 3],
[5, 6] ]
本质上它们都应该返回二维数组,因为它们的含义相同,因为它们可以互换使用!
:2 should be equivalent to [0,1] #For rows
1: should be equivalent to [1,2] #For cols
问题: 为什么花式索引不作为切片符号返回?以及如何实现?
请赐教。 谢谢
【问题讨论】:
-
我不明白你为什么期望同样的结果。
arr[ [0,1], [1,2] ]返回一个包含两个元素的列表:第 0 行第 1 列的第一个元素和第 1 行和第 2 列的第二个元素。arr[:2, 1:]返回包含第 0-1 行和第 1-2 列的二维子数组。这是预期的,并且记录的行为:numpy.org/doc/stable/reference/arrays.indexing.html -
@ThomasSablik 但是当我做 arr[ [0,1] ] ~ 只传递行列表意味着与 arr[:2] 相同,所以当与列结合时它应该返回相同!跨度>
-
2 ** 2和2 * 2和2 + 2返回相同的结果。这是否意味着运营商**、*和+总是这样做?您发现了一种特殊情况,其中精美的索引和切片返回相同的结果,但通常它们的行为不同。编程中最重要的规则之一是:不要期望任何东西。阅读文档。 -
索引一维时,1:4 和 [1,2,3] 选择相同的东西。但在 2d 中,一对列表与切片不同。阅读完整的 numpy 索引文档。
-
@ThomasSablik,我对您的解释感到满意,但问题是当我们“切片”时,我们受限于顺序访问行或列。我的意思是 arr[:3,2:] 将遵循 0,1,2 行和 2,3 列的顺序,并且无法从中进行评估。要以手动顺序访问,我们会执行一些称为“花式索引”的操作。但是作为它的行为,我们没有得到整组行,而是得到了它们相交的值。如果我想以 row = [0,2,1] 和 col = [1,0,2] 的方式访问并想要整行和整列怎么办?我很欣赏你的回答方式。
标签: python arrays numpy indexing