花式索引与Numpy中的视图

时间:2018-10-24 11:34:52

标签: python-3.x numpy

我对附加链接中的文章的另一部分感到困惑:

https://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html

在“但是花哨的索引有时似乎返回视图,不是吗?”

第一个成语:

a = np.arange(10)
a[[1,2]] = 100
a
#array([  0, 100, 100,   3,   4,   5,   6,   7,   8,   9])

第二个成语:

a = numpy.arange(10)
c1 = a[[1,2]]
c1[:] = 100
a
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c1
#array([100, 100])

关于第一个成语如何进行更改,我还是有些困惑?

他们解释说,第一个习惯用法不是在 setitem 之前调用 getitem ,但是为什么不这样做呢?

我认为所有花式索引都返回数据的副本而不是视图,而与所使用的惯用法无关吗?

尽管花哨的索引并没有创建显示的视图,因为它仍然可以提供预期的结果,是否仍然如成语1所示使用它仍然被认为是一种好习惯?

1 个答案:

答案 0 :(得分:1)

原因是Python的工作方式。

第一个语句调用setitem方法,第二个语句getitem。第一个不会创建新对象,但是第二个会创建对象(对于花式索引,它将创建用于常规索引的视图)。

当然,我们希望这种行为,以便我们可以在数组中设置一些非“常规”值以及视图不起作用的值。