我有一个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
需要花费大量时间,效果很好。有没有什么方法可以让它更快或更蟒蛇化,以便它快速?
答案 0 :(得分:6)
这是通过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)
我不认为这对相对较小的数组有用。并且线程有时也可以更好地处理这个问题。
答案 1 :(得分:0)
我的机器速度提高了10%,因为它避免了循环:
numpy.matrix(X) * numpy.matrix(X.T)
但仍有50%的冗余。