Python 3.x Numpy中奇特的索引与视图

Python 3.x Numpy中奇特的索引与视图,python-3.x,numpy,Python 3.x,Numpy,我被附加链接中文章的另一部分弄糊涂了: 在“但是奇特的索引有时似乎会返回视图,不是吗?” 第一个成语: 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]) >>

我被附加链接中文章的另一部分弄糊涂了:

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

第一个成语:

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所示

原因是Python的工作方式

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


当然,我们需要这种行为,这样我们就可以在数组中设置一些值,这些值不是“常规”的,并且视图不起作用。

我不确定我是否完全理解这一点。似乎不仅仅是这个成语?看看这里的例子:这是因为它不仅仅是对
setitem
的一个调用,有两个索引,一个是get,创建一个新数组,另一个是set。如果在同一语句上有两个[],第一个是get,第二个是set。首先从数组中检索一些数据,无论是视图还是副本,然后在赋值的右侧设置值。两次,最后一个切片都是setitem。这两次,第一个都是get项。第一个表达式首先创建一个视图,然后调用该视图上的set,修改原始数组。第二次,你复制数据,然后调用set,修改复制的数据而不是原始数据。我想你明白了是的