比较两个不同大小的 numpy 数组的最佳方法

bla*_*bug 2 python numpy

我有 2numpy array个不同尺寸的。理论上,一个将是另一个的子集。我想在较大的索引中找到numpy array其值与较小的子集匹配的索引。

例如

A = [ 7.52   8.32  16.96  20.05 -24.96 -42.69 -47.47  55.04 -57.62   2.03
  61.94  64.41 -71.3   93.6  151.65 151.75  -0.43  -3.18   4.59  -5.55
   6.44  -9.48   9.31   0.67 -14.34  -8.09  16.23  17.69  19.46  23.52
 -52.59]

B = [61.94 16.23 19.46 -5.55 -0.43 93.6]
Run Code Online (Sandbox Code Playgroud)

2 个for循环将执行此操作,但我想知道是否有 Python 方法可以更快地执行此操作。

我尝试了一个循环,但它不起作用(我怀疑numpy.where它不适用于不同大小的数组)

A = [ 7.52   8.32  16.96  20.05 -24.96 -42.69 -47.47  55.04 -57.62   2.03
  61.94  64.41 -71.3   93.6  151.65 151.75  -0.43  -3.18   4.59  -5.55
   6.44  -9.48   9.31   0.67 -14.34  -8.09  16.23  17.69  19.46  23.52
 -52.59]

B = [61.94 16.23 19.46 -5.55 -0.43 93.6]
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激:)

谢谢

Cyt*_*rak 5

您可以使用np.in1d检查哪些索引匹配,您将获得一个布尔数组。

>>> np.in1d(A,B)
array([False, False, False, False, False, False, False, False, False,
       False,  True, False, False,  True, False, False,  True, False,
       False,  True, False, False, False, False, False, False,  True,
       False,  True, False, False])
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作以获取实际索引:

>>> np.arange(A.shape[0])[np.in1d(A,B)]
array([10, 13, 16, 19, 26, 28])
Run Code Online (Sandbox Code Playgroud)

注意:对于大型数组,这执行得非常快,并且易于检查相反的情况。无论是np.in1d(A,B,invert=True)np.arange(A.shape[0])[~np.in1d(A,B)]

编辑:正如评论中所建议的,以一种非常显眼的方式(我错过了,天知道为什么?!)来获取索引:np.nonzero(np.in1d(A,B))

  • 获取索引的更紧凑方法是“np.nonzero(np.in1d(A, B))” (3认同)