编写以下内容的最快方法

Fastest way to write the following

我在 python 中执行以下操作:

tmp = np.empty_like(J,dtype=X.dtype)
for idx, (ii, jj) in enumerate(zip(I, J)):
    tmp[idx] = sum((X[ii] - X[jj])**2)

其中 X 是一个 50000 x 128 的 numpy 数组 I 和 J 是整数 numpy 数组,大小为 (763690,)(稀疏矩阵的列和行)

现在的问题是,上述操作大约需要 30 秒才能完成,我看不出需要做什么来加快速度。我知道它可以更快地完成,因为我在 Matlab 中有一个类似的代码,它几乎不需要任何时间。

我在这里做错了什么? 是否与内存步幅访问有关?不使用内置函数?或者是其他东西?我应该parallelize/vectorize吗?

(我知道标题很烂,但一直想不出好的写法,欢迎指教!)

我们可以这样做:

np.sum((X[I]-X[J])**2, axis=1)

因此我们首先使用下标生成一个 763 690×128 矩阵 X[I] 其中对于 I 中的每个项目我们使用相应的行XX[j] 也是如此。然后我们将两者相减,得到一个763 690×128的矩阵。我们可以按元素对项目进行平方,然后计算第一个轴上的总和。因此,这意味着对于每一行,我们都会获得一个值。因此,结果是一个 flat 数组,其中包含 763 690 个元素。

Willems 方法太棒了!

np.sum((X[I]-X[J])**2, axis=1)

运行时间从~30s到~0.6s,非常感谢:)