矢量化numpy函数可以使用缓冲区作为输出吗?

时间:2013-02-11 23:55:06

标签: python numpy

我是否可以使用numpy向量化函数来使用缓冲区对象作为结果,而不是创建该对象返回的新数组?

我想做这样的事情:

fun = numpy.vectorize(lambda x: x + 1)
a = numpy.zeros((1, 10)
buf = numpy.zeros((1, 10)
fun(a, buf_obj = buf)

而不是

fun = numpy.vectorize(lambda x: x + 1)
a = numpy.zeros((1, 10)
buf = fun(a)

1 个答案:

答案 0 :(得分:3)

不适用于vectorize,但是大多数numpy函数都会使用out参数来完全按照您的意愿执行。

您尝试使用numpy.vectorize的功能是什么?当你试图“矢量化”计算时,vectorize几乎总是错误的解决方案。

在上面的示例中,如果您想要就地执行操作,可以使用以下命令完成操作:

a = numpy.zeros((1, 10))
a += 1

或者,如果你想要有点冗长,但要完全按照你的例子做的事情:

a = numpy.zeros((1, 10))
buf = numpy.empty_like(a)
numpy.add(a, 1, out=buf)

numpy.vectorize必须为数组中的每个元素调用python函数。因此,与在整个阵列上运行的numpy函数相比,它具有额外的开销。通常,当人们提到“向量化”表达式以获得加速时,他们指的是用基本numpy函数的构建块构建表达式,而不是使用vectorize(这当然令人困惑...... )。


编辑:根据您的评论,vectorize确实适合您的使用案例! (编写“光栅计算器”是一个非常完美的用例,超出安全/沙盒问题。)

另一方面,如果您不介意额外的依赖,numexpr可能更适合。

速度更快,需要out个参数。