Python 所有行对上的快速点积
我有一个2d numpy数组Python 所有行对上的快速点积,python,arrays,numpy,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,则该方法效果良好。有没有什么方法可以使它更快,或者做得更像pyth
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
,则该方法效果良好。有没有什么方法可以使它更快,或者做得更像pythonical,使它更快?通过执行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)
我不认为这对相对较小的阵列有用。线程有时也能更好地解决这一问题。这在我的机器上快了10%,因为它避免了循环:
numpy.matrix(X) * numpy.matrix(X.T)
但是仍然有50%的冗余。人们通常避免使用
numpy.matrix
,而更喜欢numpy.dot
。否则,我同意这一点,因为我提出了基本相同的建议;)块大小或10k表示总共1k个样本?块位于特征空间中,因此10k块表示100k个特征。正如我所说,我认为在大多数情况下,X.dot(X.T)在很大程度上起到了作用。关于'X.dot(X.T)'的内存消耗,它应该分配np.zero((X.shape[0],)*2)
,并写入其中。完全可以在没有太多内存开销的情况下执行此操作。不过,我不能告诉你numpy是怎么做到的。内存是您用例的一个问题吗?如果是这样,请提供一些维度。您始终可以从并行
中提取迭代,并将其作为for循环直接写入结果数组(上面的零
),避免将所有中间矩阵都存储在内存中。