所有行上的快点产品

时间:2014-07-03 14:23:15

标签: python arrays numpy

我有一个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需要花费大量时间,效果很好。有没有什么方法可以让它更快或更蟒蛇化,以便它快速?

2 个答案:

答案 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%的冗余。