Python 避免创建新阵列作为numpy/scipy操作的结果?
对于在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 有没有办法做到这一点?我希望这不仅仅
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对象或分配内存块与矩阵乘法本身所需的计算相比是便宜的。