Python 作用于提供的数组的函数
Python function that acts on provided array
一些 NumPy 函数(例如 argmax
或 cumsum
)可以将数组作为可选的 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=].
一些 NumPy 函数(例如 argmax
或 cumsum
)可以将数组作为可选的 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=].