Python 避免创建新阵列作为numpy/scipy操作的结果?

Python 避免创建新阵列作为numpy/scipy操作的结果?,python,numpy,memory-management,optimization,scipy,Python,Numpy,Memory Management,Optimization,Scipy,对于在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 有没有办法做到这一点?我希望这不仅仅

对于在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
有没有办法做到这一点?我希望这不仅仅是为了复制,而是为了所有返回矩阵或向量的操作

参见IPython书籍中的内容。在此基础上,注意以下指南:

a *= b
不会产生副本,鉴于:

a = a * b
我会复印一份。另外,
flant()
将进行复制,而
ravel()
仅在必要时进行复制,否则将返回视图(因此通常应首选)<代码>重塑()也不会生成副本,但会返回视图

此外,正如@hpaulj和@ali_m在他们的评论中指出的,许多numpy函数都支持
out
参数,因此请查看文档。发件人:

out:ndarray,可选 输出参数

这必须是不使用时返回的确切类型。特别是,它必须具有正确的类型,必须是C连续的,并且它的数据类型必须是为点(a,b)返回的数据类型。这是一个性能特性。因此,如果不满足这些条件,将引发异常,而不是尝试灵活处理


检查函数的文档。有些将
取出
参数,尤其是
ufunc
参数。基本运算符的版本有
+=
*=
ufuncs
还有
reduce
accumulate
方法来处理重复操作。您使用
np.dot
给出的示例代码已经做到了这一点,
np.dot
的第三个参数是
out=
参数,因此
xu new
将用
np.dot>的结果填充到位(a,x)您可能还想考虑<代码> NP.DOT(NP.LIALG.Matrix XPOWER(A,100),X)。注意,在大多数情况下,您的直觉认为“有很多开销”是不正确的。创建新的Python对象或分配内存块与矩阵乘法本身所需的计算相比是便宜的。