7

numpy次のコードを検討してください。

A[start:end] = B[mask]

ここ:

  • AおよびBは、同じ列数の 2D 配列です。
  • startおよびendスカラーです。
  • mask1D ブール配列です。
  • (end - start) == sum(mask).

原則として、上記の操作は、 の要素を に直接O(1)コピーすることにより、一時ストレージを使用して実行できます。BA

これは実際に実際に起こることですか、それともnumpy一時的な配列を構築しB[mask]ますか? 後者の場合、ステートメントを書き直すことでこれを回避する方法はありますか?

4

2 に答える 2

3

この線

A[start:end] = B[mask]

Python言語の定義によれば、最初に右側を評価し、の選択された行を含み、B追加のメモリを占有する新しい配列を生成します。これを回避するために私が知っている最も効率的な純粋なPythonの方法は、明示的なループを使用することです。

from itertools import izip, compress
for i, b in izip(range(start, end), compress(B, mask)):
    A[i] = b

もちろん、これは元のコードよりも時間効率がはるかに低くなりますが、O(1)の追加メモリのみを使用します。itertools.compress()また、Python2.7または3.1以降で使用できることにも注意してください。

于 2011-05-11T09:53:32.237 に答える
2

ブール配列をインデックスとして使用することは、派手なインデックス作成であるため、numpyはコピーを作成する必要があります。メモリの問題が発生した場合は、それに対処するためにcython拡張機能を作成できます。

于 2011-05-11T09:52:28.877 に答える