获取第一个数组的行,匹配第二个数组的行

时间:2016-10-26 10:22:07

标签: python numpy vectorization

假设我有一个形状为A的数组(M, K)和另一个形状为B的{​​{1}}。

(N, K)的行是可以遇到的所有可能模式(因此每个模式都是大小为B的1D数组)。

因此,我希望获得一个K形状的数组C,其中(M,)是行C[i]的模式(B)的指示在i

我目前正在循环中执行此操作(即循环遍历所有可能的模式)但我最终会使用矢量化。

以下是一个例子:

A

我期待:

A = np.array([[0, 1], [0, 1], [1, 0]])
B = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

1 个答案:

答案 0 :(得分:1)

基于this solution,这是使用np.searchsorted -

的矢量化解决方案
dims = B.max(0)+1
A1D = np.ravel_multi_index(A.T,dims)
B1D = np.ravel_multi_index(B.T,dims)
sidx = B1D.argsort()
out = sidx[np.searchsorted(B1D,A1D,sorter=sidx)]

示例运行 -

In [43]: A
Out[43]: 
array([[72, 89, 75],
       [72, 89, 75],
       [93, 38, 61],
       [47, 67, 50],
       [47, 67, 50],
       [93, 38, 61],
       [72, 89, 75]])

In [44]: B
Out[44]: 
array([[47, 67, 50],
       [93, 38, 61],
       [41, 55, 27],
       [72, 89, 75]])

In [45]: out
Out[45]: array([3, 3, 1, 0, 0, 1, 3])