编写以下内容的最快方法
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
中的每个项目我们使用相应的行X
。 X[j]
也是如此。然后我们将两者相减,得到一个763 690×128的矩阵。我们可以按元素对项目进行平方,然后计算第一个轴上的总和。因此,这意味着对于每一行,我们都会获得一个值。因此,结果是一个 flat 数组,其中包含 763 690 个元素。
Willems 方法太棒了!
np.sum((X[I]-X[J])**2, axis=1)
运行时间从~30s到~0.6s,非常感谢:)
我在 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
中的每个项目我们使用相应的行X
。 X[j]
也是如此。然后我们将两者相减,得到一个763 690×128的矩阵。我们可以按元素对项目进行平方,然后计算第一个轴上的总和。因此,这意味着对于每一行,我们都会获得一个值。因此,结果是一个 flat 数组,其中包含 763 690 个元素。
Willems 方法太棒了!
np.sum((X[I]-X[J])**2, axis=1)
运行时间从~30s到~0.6s,非常感谢:)