我对附加链接中的文章的另一部分感到困惑:
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所示使用它仍然被认为是一种好习惯?
答案 0 :(得分:1)
原因是Python的工作方式。
第一个语句调用setitem
方法,第二个语句getitem
。第一个不会创建新对象,但是第二个会创建对象(对于花式索引,它将创建用于常规索引的视图)。
当然,我们希望这种行为,以便我们可以在数组中设置一些非“常规”值以及视图不起作用的值。