2013-03-14 22 views
18

一時的な配列の作成を避けるために、操作している同じ配列に値を代入するのは安全ですか?numexpr.evaluate( "a + b"、out = a)

project homepageでのメモリ使用の説明からは、大丈夫ですが、ソースコードに乗ることなく、それは確かに固い答えです。 numexprはまだ1024年のチャンクサイズにもかかわらず、内部的に一時的な配列を使用しているため、

import numpy as np 
import numexpr as ne 
a = np.ones(5) 
b = a.copy() 
ne.evaluate("a+b",out=a) 
array([ 2., 2., 2., 2., 2.]) 
+7

私は頭の上から安全ではない場合は考えられません(潜在的に問題を引き起こすインデックス作成の多くは、numexprでは機能しません)。副次的に、あなたの例のような単純なケースでは、 'np.add(a、b、out = a)'を認識することも有益です。 'numexpr'は非常にいいですが、別の依存関係が必要ない場合は、それを使わないで一時配列を避けることができます。 –

答えて

7

それは動作します:

は、私が正常に動作し、以下を試してみましたが、私は、このパッケージに慣れ誰かからの確認を期待しています要素(またはVMLを使用する場合は4096)。これらの入力のチャンクはスライスとして考えることができますが、評価中のスピードとメモリのコンパクトさのために適切なCデータ型として格納されます。結果は、各チャンクの計算が実行された後にoutパラメータに格納されます。そうでない場合は、入力と同じサイズの配列を割り当てる必要があります。

numexprがベクトル演算を評価する方法の擬似コードについては、Why It Worksのセクションを参照してください。

関連する問題