我有一个2d 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,那么这个方法就很有效。有没有什么方法可以让它更快,或者做得更像蟒蛇那样快?

最佳答案

通过执行result = X.dot(X.T)
当数组变大时,可以执行块操作,但根据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/

10-10 03:38