根据另一个numpy数组重新排列numpy数组的每一行的列

时间:2018-05-01 06:11:57

标签: numpy numpy-broadcasting

我们有一个名为 main_arr 的主数组,我们希望使用 guide_arr result 的数组,其大小相同> 再次使用相同的尺寸:

import numpy as np
main_arr = np.array([[3, 7, 4], [2, 5, 6]])
guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
result = np.zeros(main_arr.shape)

我们需要结果等于:

if np.array_equal(result, np.array([[7, 4, 3], [2, 6, 5]])):
    print('success!')

我们应该如何使用 guide_arr

guide_arr [0,0]为2,表示结果[0,2] = main_arr [0,0]

guide_arr [0,1]为0表示结果[0,0] = main_arr [0,1]

guide_arr [0,2]为1表示结果[0,1] = main_arr [0,2]

第1行也是如此。

总之,main_arr中的项目应该重新排序(在一行中,行永远不会更改),以便它们的新列索引等于guide_arr中的数字。

1 个答案:

答案 0 :(得分:1)

In [199]: main_arr = np.array([[3, 7, 4], [2, 5, 6]])
     ...: guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
     ...: 

重新排序列的常用方法(顺序不同于行)是使用这样的索引:

In [200]: main_arr[np.arange(2)[:,None],guide_arr]
Out[200]: 
array([[4, 3, 7],
       [2, 6, 5]])

arange(2)[:,None]是一个用(2,3)索引数组广播的列数组。

我们可以将相同的想法应用于guide_arr来识别result中的列:

In [201]: result = np.zeros_like(main_arr)
In [202]: result[np.arange(2)[:,None], guide_arr] = main_arr
In [203]: result
Out[203]: 
array([[7, 4, 3],
       [2, 6, 5]])

这可以澄清广播的运作方式:

In [204]: np.broadcast_arrays(np.arange(2)[:,None], guide_arr)
Out[204]: 
[array([[0, 0, 0],
        [1, 1, 1]]), 
 array([[2, 0, 1],
        [0, 2, 1]])]