【发布时间】:2016-02-14 04:42:57
【问题描述】:
我有两个 numpy 数组,A 和 B。A 包含唯一值,B 是 A 的子数组。 现在我正在寻找一种方法来获取 A 中 B 值的索引。
例如:
A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.array([1,7,10])
# I need a function fun() that:
fun(A,B)
>> 0,6,9
【问题讨论】:
我有两个 numpy 数组,A 和 B。A 包含唯一值,B 是 A 的子数组。 现在我正在寻找一种方法来获取 A 中 B 值的索引。
例如:
A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.array([1,7,10])
# I need a function fun() that:
fun(A,B)
>> 0,6,9
【问题讨论】:
您可以将np.in1d 与np.nonzero 一起使用-
np.nonzero(np.in1d(A,B))[0]
您也可以使用np.searchsorted,如果您关心维护订单-
np.searchsorted(A,B)
对于一般情况,当A & B 是未排序的数组时,您可以在np.searchsorted 中引入sorter 选项,就像这样-
sort_idx = A.argsort()
out = sort_idx[np.searchsorted(A,B,sorter = sort_idx)]
我也会添加我最喜欢的broadcasting 来解决一般情况 -
np.nonzero(B[:,None] == A)[1]
示例运行 -
In [125]: A
Out[125]: array([ 7, 5, 1, 6, 10, 9, 8])
In [126]: B
Out[126]: array([ 1, 10, 7])
In [127]: sort_idx = A.argsort()
In [128]: sort_idx[np.searchsorted(A,B,sorter = sort_idx)]
Out[128]: array([2, 4, 0])
In [129]: np.nonzero(B[:,None] == A)[1]
Out[129]: array([2, 4, 0])
【讨论】:
isin 而不是 in1d
你试过searchsorted吗?
A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.array([1,7,10])
A.searchsorted(B)
# array([0, 6, 9])
【讨论】:
仅出于完整性考虑:如果 A 中的值不是负数且相当小:
lookup = np.empty((np.max(A) + 1), dtype=int)
lookup[A] = np.arange(len(A))
indices = lookup[B]
【讨论】: