2013-11-01 6 views
8

大きな2dのnumpy配列が与えられた場合、効率的に行10000:10010などの行の範囲を削除したいと考えています。さまざまな範囲でこれを何度もやらなければならないので、私はそれを並列化できるようにしたいと思います。大規模な配列から効率的に行の範囲を削除する方法はありますか?

numpy.delete()のようなものを使用すると、あまりにも多くの時間とメモリを必要とするため、アレイをコピーする必要があるため効率的ではありません。理想的には、ビューを作成するようなことをしたいと思っていますが、私はこの場合どのようにできるのか分かりません。マスクされた配列では、下流操作がサポートされていないため、マスクされた配列もオプションではありません。

アイデア?

+1

ダウンストリーム操作とは何ですか?あなたは削除された行を追跡することによって削除を偽装しようとすることができます... – Jaime

答えて

3

numpy配列を定義するストライドされたデータ構造のため、マスクされた配列を使用しなければ、望むものはできません。あなたの最善の選択肢は、削除された行をマスクするためにマスクされた配列(またはおそらく独自のブール配列)を使用して、それを下流に渡す前に削除するすべての行の単一の実際の操作を実行することかもしれません。

+0

ありがとう、私はこれを回避する方法がないと思う(しかし、誰かが創造的な解決策を思い付くかどうか見てみましょう)。私はあなたがなぜマスクしてから削除することを提案したのか理解できません - 削除するだけではいかがですか? – Bitwise

+1

これは、削除するものを特定するコードがどのように動作しなければならないかについての部分的な推測です。あなたが指摘したように、行の範囲を繰り返し削除すると、メモリと時間の両方で非効率的になります。また、私は、「さまざまな範囲でこれを複数回実行しなければならない」と解釈しました。これを並行して実行するには、基本となる配列を変更せずに、適切な「削除済み」ビットを反転するだけです。次に、削除するすべての行を見つけたら、最後の非並行ステップで実際の「削除」操作を実行できます。 –

2

すでに説明したように、削除操作を高速化する方法は実際にはありませんが、このような削除を行うには、データをメモリにコピーする必要があります。 @WarrenWeckesserの示唆するように、あなたができることの1つは、複数の削除操作を結合し、すべてを一度に適用することです。ここでは例です:

ranges = [(10, 20), (25, 30), (50, 100)] 
mask = np.ones(len(array), dtype=bool) 

# Update the mask with all the rows you want to delete 
for start, end in ranges: 
    mask[start:stop] = False 

# Apply all the changes at once 
new_array = array[mask] 

それは本当にあなたがちょうどそう、これはより多くのCPUが助けにはなりません追加、とにかく束縛メモリになりますメモリ内のものをコピーしているので、これを並列化しても意味がありません。

0

これは、上記と比べるとわかりませんが、配列Aから保持したい行の行インデックスのリストLを持っています(「行」によって、より高次元のアレイの場合)。その他の行はすべて削除されます。 Aは結果を保持します。

A = A[np.ix_(L)] 
関連する問題