我正在尝试了解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),]
将保持不变。
这一切怎么了?我是误会还是错过了重要的事情?
如果是,请纠正我并提前感谢!
答案 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__()
有关。