我是否可以使用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)
答案 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
个参数。