X
(おおよそ(1e3,1e3,1e3))があります。X
の操作を行いたい場合、0番目の軸の特定の要素を含めます。第1軸と第2軸)。すなわち、(時には)マスクを出し入れしたい(1e3,1e3)個の要素があります。numpyのマスク配列で効率的なメモリ使用
最も簡単な方法は、
Z = np.zeros_like(X, dtype=bool)
# assume `inds` is some indexing array which will target
# the particular (1e3 x 1e3) elements I'm interested in
Z[inds] = True
Y = np.ma.masked_array(X, mask=Z)
、のようなマスクされた配列を構築することだろう。しかし、これは単にマスキング配列にメモリの余分ギガバイトを使用しています。 マスクの要素配列10^9
を構築しないと、これを行う方法はありますか?たとえば、マスクのスパース行列を構成することは可能ですか?
Nope; 'scipy.sparse'はどのような種類のマスキングも実装していません。そして 'np、ma'は'疎な '行列を使うことはできません。計算を行う際、np.maはマスクされた値を無害な値(例えば0、1s)で埋めるか、マスクされた値なしで配列を1dに圧縮することに留意してください。適切な場合は、これらのステップを直接実装できます。 – hpaulj
@hpauljありがとう!それはとても役に立ちます。 'np.ma.std'のような関数の場合、マスクされた値はどのように処理されますか? 'axis'引数がない場合、おそらく配列は平坦化されますが、' axis'引数があれば、それは平らにすることも0を埋め込むこともできません。 – DilithiumMatrix
'numpy/ma/core.py'を調べる必要があるようです。 'np.ma.std'はma' std'メソッドを使います。これは 'mean'を使う' var'を使い、 'mean'と' count'を使います。 'ma.sum'は' filled(0) 'を使います。 'count'のように見えるのは、'〜mask 'に 'sum'を使います。すなわち、軸ごとにマスクされていない値を数えます。 – hpaulj