在多个 numpy 数组中查找相交值

Find intersecting values in multiple numpy arrays

我有 100 个大数组,每个数组 > 250,000 个元素。我想找到这些数组中的共同值。我知道不会在所有 100 个数组中都找到值,但会在多个数组中找到少量数值(我怀疑是 10-30%)。我想找出这些数组中出现频率最高的值。 (旁白:数组没有重复项)

我知道我可以遍历数组并最终找到它们,但这需要一段时间。我也知道 np.intersect1d 函数,但我只给出了在所有数组中找到的值,而我正在寻找的值只会出现在 100 个数组中的大约 20 个中。

我最好的选择是使用 np.intersect1d 函数并遍历数组的所有可能组合,这肯定需要一段时间,但只要简单地遍历所有 250,000 x 100 值就不会那么长。 示例:

array_1 = array([1.98,2.33,3.44,,...11.1)
array_2 = array([1.26,1.49,4.14,,...9.0)
array_2 = array([1.58,2.33,3.44,,...19.1)
array_3 = array([4.18,2.03,3.74,,...12.1)
.
.
. 
array_100= array([1.11,2.13,1.74,,...1.1)

100个都没有值,有没有一个值可以在30个不同的数组中找到?

您可以使用 np.unique with the return_counts keyword, or a vanilla Python Counter.

如果您可以将数组连接成一个 250k x 100 的整体,或者甚至将它们一个接一个地串起来,第一个选项就可以工作:

unq, counts = np.unique(monolith, return_counts=True)
ind = np.argsort(counts)[::-1]
unq = unq[ind]
counts = counts[ind]

这将为您留下一个包含所有唯一值及其出现频率的数组。

如果数组必须保持独立,请使用 collections.Counter 来完成相同的任务。在下文中,我假设您有一个包含数组的列表。拥有一百个单独命名的变量将毫无意义:

c = 计数器() 对于数组中的 arr: c.update(arr)

现在 c.most_common 将为您提供最常见的元素及其计数。