3

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

1 回答 1

3

不是 for vectorize,但大多数 numpy 函数采用的out参数正是你想要的。

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

在上面的示例中,如果您想就地执行操作,可以通过以下方式完成:

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参数。

于 2013-02-12T00:15:06.100 回答