【发布时间】:2017-05-28 15:00:40
【问题描述】:
我有一个长度为 tot_vec 的 numpy 数组 embed_vec,其中每个条目都是一个 3d 向量:
[[ 0.52483319 0.78015841 0.71117216]
[ 0.53041481 0.79462171 0.67234534]
[ 0.53645428 0.80896727 0.63119403]
...,
[ 0.72283509 0.40070804 0.15220522]
[ 0.71277758 0.38498613 0.16141834]
[ 0.70221445 0.36918032 0.17370776]]
对于这个数组中的每个元素,我想找出与该条目“接近”的其他条目的数量。接近,我的意思是两个向量之间的距离小于指定值R。为此,我必须将这个数组中所有可能的对相互比较,然后找出数组中每个向量的接近向量的数量。所以我这样做:
p = np.zeros(tot_vec) # This contains the number of close vectors
for i in range(tot_vec-1):
for j in range(i+1, tot_vec):
if np.linalg.norm(embed_vec[i]-embed_vec[j]) < R:
p[i] += 1
但是,这是非常低效的,因为我有两个嵌套的 python 循环并且对于更大的数组大小,这需要很长时间。如果这是在 C++ 或 Fortran 中,那将不是一个大问题。我的问题是,可以使用某种矢量化方法有效地使用 numpy 实现相同的目标吗?作为旁注,我也不介意使用 Pandas 的解决方案。
【问题讨论】:
-
在您的实际用例中
embed_vec的形状是什么? -
@Divakar:是
(60000, 3) -
@Peaceful 我删除了评论,因为您使用的是多维距离。尽管我可能会尝试使用其中的一些逻辑,但这是一个截然不同的问题
-
你可以使用scipy的
pdist得到一个距离矩阵。如果tot_vec很大,可能会遇到内存问题。 -
真的应该有人为此实现一些东西。它必须是关于被问到最多的 numpy 问题。
标签: python arrays pandas numpy vectorization