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

ではありませんが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ます。

于 2013-02-12T00:15:06.100 に答える