我有一个非常大的一维 numpy 数组,我想对它在一个切片上应用一些排序,并检索排列向量以进行其他处理。
但是,ndarray.sort()(这是一个就地操作)方法不会返回此向量,我可能会使用 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 的 View 时,以下代码不修改 V?
Vslice = Vslice[iperm]
祝你好运!
弗朗索瓦
最佳答案
要回答为什么分配给查看不修改原始文件的问题:
您需要将 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])
关于python - numpy数组的就地置换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27566566/