我有一个非常大的n维数组,我希望在一个切片上应用一些排序,并检索排列向量以进行其他处理。
但是,ndarray.sort()(这是一个inplace操作)方法不返回此向量,我可以使用ndarray.argsort()方法获取置换向量并使用它来置换切片。但是,我无法弄清楚如何在现场进行。
Vslice = V[istart:istop] # This is a view of the slice
iperm = Vslice.argsort()
V[istart:istop] = Vslice[iperm] # Not an inplace operation...
辅助问题:为什么以下代码不会修改V,因为我们正在研究V的视图?
Vslice = Vslice[iperm]
祝福!
弗朗索瓦
答案 0 :(得分:3)
回答你为什么分配给视图不会修改原文的问题:
您需要将Vslice = Vslice[iperm]
更改为Vslice[:] = Vslice[iperm]
,否则您将新值分配给Vslice
而不是更改值在Vslice
内:
>>> a = np.arange(10, 0, -1)
>>> a
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
>>> b = a[2:-2]
>>> b
array([8, 7, 6, 5, 4, 3])
>>> i = b.argsort()
>>> b[:] = b[i] # change the values inside the view
>>> a # note `a` has been sorted in [2:-2] slice
array([10, 9, 3, 4, 5, 6, 7, 8, 2, 1])