基于另一个numpy数组重新排序numpy数组每行的列

基于另一个numpy数组重新排序numpy数组每行的列,numpy,array-broadcasting,Numpy,Array Broadcasting,我们有一个名为main\u 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.arra

我们有一个名为main\u 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[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中的数字

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)索引数组进行广播的列数组

我们可以将同样的想法应用于使用
指南\u arr
来识别
结果中的列

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