【发布时间】:2019-11-15 15:11:28
【问题描述】:
假设我们有两个具有相同行数的二维 numpy 数组 a 和 b。进一步假设我们知道a 和b 的每一行i 最多有一个共同元素,尽管这个元素可能出现多次。我们如何才能尽可能高效地找到这个元素?
一个例子:
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,但编码工作量不应该太多。
【问题讨论】:
-
所有元素都应该是正整数吗?这些值有上限吗?
-
@Divakar:不。元素是双精度的,四舍五入到合理的水平以避免由于机器不精确而导致的错误。原则上它们可以转换为正整数,但我认为这是理论上的重要性,而不是实际的重要性。
标签: python numpy vectorization set-operations