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
ожидает отсортированный массив.
index
- это почти нужный ответ, за исключением того, что мы хотим отобразить
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)]