我有一个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/