【问题标题】:Inplace permutation of a numpy arrraynumpy数组的就地排列
【发布时间】:2015-02-18 10:04:54
【问题描述】:

我有一个相当大的一维 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 的视图时,下面的代码没有修改 V?

Vslice = Vslice[iperm]

祝你好运!

弗朗索瓦

【问题讨论】:

    标签: python arrays algorithm numpy


    【解决方案1】:

    回答您关于为什么分配给 view 不会修改原始内容的问题:

    您需要将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])
    

    【讨论】:

    • 请注意,即使将结果写回原始数组,操作也不会“就地”发生:按排序顺序制作子数组的副本,然后是其内容被写回原始数组。
    • @Jaime 这是真的。这应该回答帖子中的最后一个问题
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2017-08-26
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多