python - 所有行对上的快速点积

标签 python arrays numpy

我有一个二维 numpy 数组 X = (xrows, xcols) 我想在数组的每一行组合上应用点积以获得另一个形状为 P 的数组= (xrow, xrow).

代码如下所示:

P = np.zeros((xrow, xrow))
for i in range(xrow):
   for j in range(xrow):
      P[i, j] = numpy.dot(X[i], X[j])

如果数组 X 很小,它会工作得很好,但对于很大的 X 会花费很多时间。有什么方法可以让它更快或更像 python 以使其更快吗?

最佳答案

这是通过做 result = X.dot(X.T) 得到的

当数组变大时,可以用 block 来完成,但是根据你的 numpy 后端,这应该已经尽可能多地并行线程化。看来这就是您要找的。

如果出于某种原因你不想依赖它,最终求助于多处理,你可以尝试一些类似的东西

import numpy as np
X = np.random.randn(1000, 100000)
block_size = 10000
from sklearn.externals.joblib import Parallel, delayed
products = Parallel(n_jobs=10)(delayed(np.dot)(X[:, pos:pos + block_size], X.T[pos:pos + block_size]) for pos in range(0, X.shape[1], block_size))
product = np.sum(products, axis=0)

我不认为这对相对较小的数组有用。线程有时也可以更好地解决这个问题。

关于python - 所有行对上的快速点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556346/

相关文章:

Python,简单的错误处理模式

Python tesseract 提高了 OCR 的准确性

c++ - 在字符数组上使用 next_permutation

python - 获取 JaggedArray 的直方图

python - 使用 mod_wsgi 进行 HTTP 基本身份验证

c++ - 正确的代码打印互换的最大值和最小值

javascript - 每个列表项的颜色选择器未正确显示

python - numpy 从三个元素中获取非最小或最大元素

python - 如何将二维数组转为一维数组?

python - Python 中的 DSA 模块