Python Numpy查找(地图或点)

Python Numpy查找(地图或点),python,indexing,numpy,Python,Indexing,Numpy,我有一个大的numpy阵列: array([[32, 32, 99, 9, 45], # A [99, 45, 9, 45, 32], [45, 45, 99, 99, 32], [ 9, 9, 32, 45, 99]]) 以及按特定顺序排列的唯一值的大数组: array([ 99, 32, 45, 9]) # B 我如何快速(没有python字典,没有A的副本,没有python循环)替换A中的值,从而成为B中值的标记 array

我有一个大的numpy阵列:

array([[32, 32, 99,  9, 45],  # A
       [99, 45,  9, 45, 32],
       [45, 45, 99, 99, 32],
       [ 9,  9, 32, 45, 99]])
以及按特定顺序排列的唯一值的大数组:

array([ 99, 32, 45, 9])       # B
我如何快速(没有python字典,没有
A
的副本,没有python循环)替换
A
中的值,从而成为
B
中值的标记

array([[1, 1, 0, 3, 2],
       [0, 2, 3, 2, 1],
       [2, 2, 0, 0, 1],
       [3, 3, 1, 2, 0]])
我觉得自己真的很傻,因为我无法在头脑中做这件事,也无法在文档中找到它。轻松点

给你

A = array([[32, 32, 99,  9, 45],  # A
   [99, 45,  9, 45, 32],
   [45, 45, 99, 99, 32],
   [ 9,  9, 32, 45, 99]])

B = array([ 99, 32, 45, 9])

ii = np.argsort(B)
C = np.digitize(A.reshape(-1,),np.sort(B)) - 1
我最初建议:

D = np.choose(C,ii).reshape(A.shape)
但我意识到,当您使用更大的阵列时,这有局限性。相反,借用@unutbu的聪明回答:

D = np.argsort(B)[C].reshape(A.shape)
还是一艘班轮

np.argsort(B)[np.digitize(A.reshape(-1,),np.sort(B)) - 1].reshape(A.shape)
我发现它比@unutbu的代码快或慢,这取决于所考虑的数组的大小和唯一值的数量

import numpy as np
A=np.array([[32, 32, 99,  9, 45],  
            [99, 45,  9, 45, 32],
            [45, 45, 99, 99, 32],
            [ 9,  9, 32, 45, 99]])

B=np.array([ 99, 32, 45, 9])

cutoffs=np.sort(B)
print(cutoffs)
# [ 9 32 45 99]

index=cutoffs.searchsorted(A)
print(index)
# [[1 1 3 0 2]
#  [3 2 0 2 1]
#  [2 2 3 3 1]
#  [0 0 1 2 3]]    
index
将索引保存到与
A
的每个元素相关联的数组截止中。注意,我们必须对
B
进行排序,因为
np.searchsorted
需要排序的数组

索引
几乎是我们想要的答案,只是我们想要映射

1-->1
3-->0
0-->3
2-->2
np.argsort
为我们提供了以下映射:

print(np.argsort(B))
# [3 1 2 0]
print(np.argsort(B)[1])
# 1
print(np.argsort(B)[3])
# 0
print(np.argsort(B)[0])
# 3
print(np.argsort(B)[2])
# 2

print(np.argsort(B)[index])
# [[1 1 0 3 2]
#  [0 2 3 2 1]
#  [2 2 0 0 1]
#  [3 3 1 2 0]]
因此,作为一条直线,答案是:

np.argsort(B)[np.sort(B).searchsorted(A)]

调用
np.sort(B)
np.argsort(B)
是低效的,因为这两个操作都相当于排序
B
。对于任何1D阵列
B

np.sort(B) == B[np.argsort(B)]
因此,我们可以使用

key=np.argsort(B)
result=key[B[key].searchsorted(A)]

这个解决方案在我的用例中执行得比较快(B.sizeI也发现unutbu的解决方案通常比较快,除非B.size