避免创建新数组作为numpy/scipy操作的结果?

May*_*ava 5 python optimization memory-management numpy scipy

对于在numpy/scipy中进行重复操作,会产生大量开销,因为大多数操作都会返回一个新对象.

例如

for i in range(100):
   x = A*x
Run Code Online (Sandbox Code Playgroud)

我想通过传递对操作的引用来避免这种情况,就像在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
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我想这不仅仅是为了复制,而是所有返回矩阵或向量的操作.

Eel*_*aak 4

请参阅IPython 书籍中的学习避免不必要的数组副本。从那里,请注意以下准则:

a *= b
Run Code Online (Sandbox Code Playgroud)

不会产生副本,而:

a = a * b
Run Code Online (Sandbox Code Playgroud)

产生一个副本。另外,flatten()将复制,而ravel()仅在必要时复制,否则返回视图(因此通常应该是首选)。reshape()也不会产生副本,而是返回视图。

此外,正如 @hpaulj 和 @ali_m 在他们的评论中指出的那样,许多 numpy 函数支持out参数,所以请查看文档。来自numpy.dot() 文档

out :ndarray,可选输出参数。

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