【问题标题】:Rearranging rows and columns of a numpy array (in a single operation) [duplicate]重新排列numpy数组的行和列(在单个操作中)[重复]
【发布时间】:2017-09-04 23:31:39
【问题描述】:

首先让我们把它放在一边: 我已经知道这里讨论的解决方案:Create NumPy array from another array by specifying rows and columns

假设我有一个数组

test = np.arange(12).reshape((3,4))

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

我想把它的行和列重新排列成test2

array([[ 1,  0,  3,  2],
       [ 9,  8, 11, 10],
       [ 5,  4,  7,  6]])

我现在使用的解决方案与上面链接中已经回答的解决方案相同:

test2 = test[[0,2,1]][:,[1,0,3,2]]

但是,此解决方案创建了一个不必要的数据中间副本:它首先创建一个仅包含混洗行的副本test[[0,2,1]],然后创建第二个包含混洗列的副本。对于这么小的阵列,没有人关心,但如果阵列是巨大的,这个解决方案感觉不是最理想的。 numpy 是否允许行和列同时洗牌?看起来像 test[[0,2,1],[1,0,3,2]] 的东西,除了 numpy 不会那样解释这个操作......

【问题讨论】:

    标签: python numpy indexing


    【解决方案1】:

    是的,这就是np.ix_的目的:

    >>> test[np.ix_([0,2,1], [1,0,3,2])]
    array([[ 1,  0,  3,  2],
           [ 9,  8, 11, 10],
           [ 5,  4,  7,  6]])
    

    它仍然会从两个输入数组创建一个中间索引数组,但不会对 test 数组进行两次索引。

    请注意,np.ix_ 只是为您的索引数组添加维度,当您索引数组时,这些维度将被“广播”:

    >>> np.ix_([0,2,1], [1,0,3,2])
    (array([[0],
            [2],
            [1]]), array([[1, 0, 3, 2]]))
    

    【讨论】:

    • 这个解决方案似乎比我目前的慢两倍......
    • 实际上,在更大的阵列上进行测试时,它(仅)稍微快了一点。
    • 是的,收支平衡似乎很高。但是对于 1kk 个项目,它已经明显快了(在我的计算机上是 2 倍)。
    • 嗯,我希望有更好的,但显然这和 numpy 允许的一样好......
    • 70k x 70k 布尔数组 a 重新排序产生了 huuuuge 的不同:209.20s35.14s分别为a[idxs][:, idxs]a[np.ix_(idxs, idxs)
    猜你喜欢
    • 2016-08-24
    • 2013-12-14
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多