numpy数组的原位置换

时间:2014-12-19 12:49:22

标签: python arrays algorithm numpy

我有一个非常大的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]

祝福!

弗朗索瓦

1 个答案:

答案 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])