假设我们有两个 2D numpy 数组a
并且b
具有相同的行数。进一步假设我们知道 和 的每一行最多i
有一个共同的元素,尽管这个元素可能出现多次。我们如何才能尽可能有效地找到这个元素?a
b
一个例子:
import numpy as np
a = np.array([[1, 2, 3],
[2, 5, 2],
[5, 4, 4],
[2, 1, 3]])
b = np.array([[4, 5],
[3, 2],
[1, 5],
[0, 5]])
desiredResult = np.array([[np.nan],
[2],
[5],
[np.nan]])
intersect1d
通过沿第一个轴应用,很容易提出一个简单的实现:
from intertools import starmap
desiredResult = np.array(list(starmap(np.intersect1d, zip(a, b))))
显然,使用 python 的内置集合操作更快。将结果转换为所需的形式很容易。
但是,我需要一个尽可能高效的实现。因此,我不喜欢starmap
,因为我认为它需要对每一行进行 python 调用。我想要一个纯矢量化的选项,并且会很高兴,如果这甚至可以利用我们的额外知识,即每行最多有一个共同值。
有谁知道如何加快任务并更优雅地实施解决方案?我可以使用 C 代码或 cython,但编码工作不应该太多。