Numpy高级索引编制和基本索引编制

时间:2018-08-31 06:50:28

标签: python numpy indexing view copy

我正在尝试了解this article的特定部分。

  

高级索引的定义意味着x[(1,2,3),]x[(1,2,3)]根本不同。后者等效于x[1,2,3],后者将触发基本选择,而前者将触发高级索引。确保了解为什么会发生这种情况。

我已经尝试了以下代码。

>>> import numpy as np 
>>> a = np.arange(50).reshape(5,10)    
>>> b = a[(2,2)]    
>>> bb = a[(2,2),]    
>>> a[2,2] = 50 # a[2,2] was 22 in the first place 
>>> b
22  # this outcome confuses me!

我认为b = a[(2,2)]会得到一个视图,因此当我更改a[2,2]时会这样做。

bb = a[(2,2),]将收到副本,因此即使我对a做某事也不会发生任何事情。

但是当我将a[2,2]从22更改为50

我期望b = a[(2,2)]将变为50 a,而bb = a[(2,2),]将保持不变。

这一切怎么了?我是误会还是错过了重要的事情?

如果是,请纠正我并提前感谢!

1 个答案:

答案 0 :(得分:0)

“基本选择”(即索引而不是切片)不会创建视图,而是会创建副本。为了成为视图,您需要传递一个元素的切片(切片与索引不同,始终是视图)。

import numpy as np 
a = np.arange(50).reshape(5,10)    
b = a[2:3,2:3].squeeze()    
a[2,2] = 50 
b

array(50)

您还可以使用b = a[2, 2, None].squeeze()来获得相同的结果,这会触发“花式”索引编制,这是选择和切片之间的一种混合,并遍历视图。使用“高级”索引编制(如您所做的那样) ,或类似b = a[[2],[2]])是索引的变体,并返回一个副本。

是的,对于那些初学者来说,保持各种索引类型的连续性并不容易。创建一个元素的视图仍然有点困难。像普通array(50)这样的大多数情况下,都可以使用像int这样的0维数组。

为了更加混乱,a[2,2] 解释为在等号的左侧而不是右侧的视图。与=被解释为.__setitem__()有关。