【发布时间】:2015-04-26 02:14:24
【问题描述】:
对于在 numpy/scipy 中进行重复操作,有很多开销,因为大多数操作返回一个新对象。
例如
for i in range(100):
x = A*x
我想通过传递对操作的引用来避免这种情况,就像在 C 中一样
for i in range(100):
np.dot(A,x,x_new) #x_new would now store the result of the multiplication
x,x_new = x_new,x
有没有办法做到这一点?我希望这不仅仅是为了乘法,而是为了所有返回矩阵或向量的操作。
【问题讨论】:
-
查看函数的文档。有些采用
out参数,尤其是ufunc参数。基本运算符有+=、*=等版本。ufuncs也有reduce和accumulate处理重复动作的方法。 -
您使用
np.dot给出的示例代码已经做到了这一点——np.dot的第三个参数是out=参数,所以x_new将用@ 的结果填充987654334@ -
您可能还想考虑
np.dot(np.linalg.matrix_power(A, 100), x)。 -
请注意,在大多数情况下,您认为存在“大量开销”的直觉是不正确的。与矩阵乘法本身所需的计算相比,创建新的 Python 对象或分配内存块的成本更低。
标签: python numpy memory-management optimization scipy