Python 矢量化numpy函数能否使用缓冲区作为输出?

Python 矢量化numpy函数能否使用缓冲区作为输出?,python,numpy,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) 不适用

我可以得到一个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)

不适用于
矢量化
,但大多数numpy函数都会使用一个
out
参数,该参数完全满足您的需要

您试图使用的
numpy.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
确实适合您的用例!(除了安全/沙箱问题外,编写“光栅计算器”是一个非常完美的用例。)

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


它的速度更快,并且提取了一个
参数。

我有一个api,它可以在二维矩阵数组中应用用户定义的函数。矩阵可能比内存大,未对齐,甚至可能表示不同的单元大小(这是一个GIS问题)。我允许用户传入一个函数,在我对所有数据进行插值和对齐后,该函数将对任意像素堆栈进行操作。有没有更好的机制允许用户对这样的数据进行操作?在这种情况下,
vectorize
可能就是您想要的!另一方面,您可以查看
numexpr
。首先,它通常要快得多,其次,它需要一个
参数。