繁体   English   中英

二维 numpy 数组中公共元素的成对计数

[英]Pairwise count of common elements in 2D numpy array

我有一个形状为 5000、9 和 dtype int 的 numpy 数组。 我正在尝试创建一个形状为 5000、5000 的 dtype int 数组,其中包含每对 arrays 中共享元素的计数。

我可以使用 itertools.combinations 和循环来完成此操作,但这种方法非常慢(在我的机器上需要 3-4 分钟),因此我正在寻找更有效的替代方法。 任何建议将不胜感激!

from itertools import combinations
import numpy as np

# create random array where row don't have duplicates
data = np.random.rand(5000, 9).argsort(axis=0)
counts = np.zeros((5000, 9), dtype=int)
for i, j in combinations(range(len(data)), 2):
    counts[i, j] = len(np.intersect1d(data[i], data[j]))

我们试试看:

# sample data with 200 unique values
np.random.seed(1)
data = np.array([np.random.choice(np.arange(200), size=9, replace=False)
                 for _ in range(5000)]
               )

# identify the unique values:
uniques = np.unique(data)

# dummy for each row
a = (data[...,None] == uniques).sum(1)

# output
out = np.einsum('ij,kj->ik',a,a)

在我的系统上大约需要 4.5 秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM