Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 所有行对上的快速点积_Python_Arrays_Numpy - Fatal编程技术网

Python 所有行对上的快速点积

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

我有一个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
,则该方法效果良好。有没有什么方法可以使它更快,或者做得更像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循环直接写入结果数组(上面的
),避免将所有中间矩阵都存储在内存中。