在numpy中将一个数组索引为另一个数组

时间:2016-06-17 10:15:22

标签: python numpy

假设我有一个带有一些任意值的矩阵 A

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

矩阵 B ,其中包含A:

中元素的索引
array([[0, 0, 1, 2],
       [0, 3, 2, 1],
       [3, 2, 1, 0]])

如何从 B 指向的 A 中选择值,即:

A[B] = [[2, 2, 4, 5],
        [1, 9, 8, 6],
        [2, 0, 7, 8]]

4 个答案:

答案 0 :(得分:20)

您可以使用NumPy's advanced indexing -

A[np.arange(A.shape[0])[:,None],B]

也可以使用linear indexing -

m,n = A.shape
out = np.take(A,B + n*np.arange(m)[:,None])

示例运行 -

In [40]: A
Out[40]: 
array([[2, 4, 5, 3],
       [1, 6, 8, 9],
       [8, 7, 0, 2]])

In [41]: B
Out[41]: 
array([[0, 0, 1, 2],
       [0, 3, 2, 1],
       [3, 2, 1, 0]])

In [42]: A[np.arange(A.shape[0])[:,None],B]
Out[42]: 
array([[2, 2, 4, 5],
       [1, 9, 8, 6],
       [2, 0, 7, 8]])

In [43]: m,n = A.shape

In [44]: np.take(A,B + n*np.arange(m)[:,None])
Out[44]: 
array([[2, 2, 4, 5],
       [1, 9, 8, 6],
       [2, 0, 7, 8]])

答案 1 :(得分:1)

我知道这是一个老问题,但是使用索引的另一种方法是:

A[np.indices(B.shape)[0], B]

输出:

[[2 2 4 5]
 [1 9 8 6]
 [2 0 7 8]]

答案 2 :(得分:0)

最近的版本添加了一个take_along_axis函数来完成这项工作:

In [203]: A = np.array([[ 2, 4, 5, 3], 
     ...:        [ 1, 6, 8, 9], 
     ...:        [ 8, 7, 0, 2]])                                                
In [204]: B = np.array([[0, 0, 1, 2], 
     ...:        [0, 3, 2, 1], 
     ...:        [3, 2, 1, 0]])                                                 
In [205]: np.take_along_axis(A,B,1)                                             
Out[205]: 
array([[2, 2, 4, 5],
       [1, 9, 8, 6],
       [2, 0, 7, 8]])

还有一个put_along_axis

答案 3 :(得分:-2)

以下是使用for循环的解决方案:

outlist = []
for i in range(len(B)):
    lst = []    
    for j in range(len(B[i])):
        lst.append(A[i][B[i][j]])
    outlist.append(lst)
outarray = np.asarray(outlist)
print(outarray)

以上也可以用更简洁的列表理解形式编写:

outlist = [ [A[i][B[i][j]] for j in range(len(B[i]))]
                for i in range(len(B))  ]
outarray = np.asarray(outlist)
print(outarray)

输出:

[[2 2 4 5]
 [1 9 8 6]
 [2 0 7 8]]