Python 作用于提供的数组的函数

Python function that acts on provided array

一些 NumPy 函数(例如 argmaxcumsum)可以将数组作为可选的 out 参数并将结果存储在该数组中。请原谅我对这里的术语掌握得不够完美(这是我无法通过谷歌搜索答案的原因),但似乎这些函数以某种方式作用于超出其范围的变量。

我将如何转换这个简单的函数,以便它可以像提到的函数那样接受一个 out 参数?

import numpy as np

def add_two(a):
    return a + 2

a = np.arange(5)

a = add_two(a)

根据我的理解,add_two() 的重写版本将允许将上面的最后一行替换为

add_two(a, out=a)

在我看来,最好和最明确的就是按照你现在正在做的事情去做。 Python 在函数中传递值而不是引用作为参数,因此您只能修改可变对象。

一种方法是:

import numpy as np
def add_two(a, out):
    out[:] = a+2
a = np.arange(5)
add_two(a, out=a)
a

输出:

array([2, 3, 4, 5, 6])

注意。与您当前的解决方案不同,这需要作为参数传递的对象 out 存在并且是一个数组

天真的解决方案是用计算结果填充输出数组的缓冲区:

def add_two(a, out=None):
    result = a + 2
    if out is None:
        out = result
    else:
        out[:] = result
    return out

问题(如果你可以这么说的话)是你仍在生成中间数组,并且有效地绕过了首先预分配结果的好处。一种更微妙的方法是在 numpy 管道中使用函数的 out 参数:

def add_two(a, out=None):
    return np.add(a, 2, out=out)

不幸的是,与一般向量化一样,这只能根据所需的操作集具体情况来完成。

顺便说一句,这与范围无关。 Python 对象特别适用于所有名称空间(尽管它们的名称可能不是)。如果在函数中修改了可变参数,则更改将始终在函数外部可见。例如参见 [​​=13=].