0

numpy.core.memmap.memmapと呼ばれるタイプ の 2 つの大きな配列がdataありnew_data、700 万を超える float32 アイテムがあります。

私は現在このようにやっている同じループ内でそれらの両方を繰り返す必要があります。

for i in range(0,len(data)):
  if new_data[i] == 0: continue
  combo = ( data[i], new_data[i] )
  if not combo in new_values_map: new_values_map[combo] = available_values.pop()
  data[i] = new_values_map[combo]

ただし、これは不当に遅いため、numpy のベクトル化関数を使用する方法が適していると私は考えています。

ベクトル化された配列がそのアイテムを他の配列の対応するアイテムと比較できるように、インデックスを使用してベクトル化することは可能ですか?

2 つの配列を zip 圧縮することを考えましたが、これにより、準備に不当なオーバーヘッドが発生するのではないでしょうか?

この操作を最適化する他の方法はありますか?

コンテキスト: 目標は、無視される new_data 配列のゼロを除いて、2 つの配列間の対応する値の一意の組み合わせが結果の配列で異なる値で表されるように、2 つの配列を効果的にマージすることです。配列は 3D ビットマップ イメージを表します。

EDIT:available_valuesまだ使用されていない一連の値でありdata、このループの呼び出し間で保持されます。new_values_map一方、このループが使用されるたびに空の辞書にリセットされます。

EDIT2: データ配列には整数のみが含まれます。つまり、ゼロとして初期化され、このループを異なる値で使用するたびに、最初は整数の範囲new_dataから引き出されたより多くの値が取り込まれます。理論上は何でもよい。available_valuesnew_data

4

3 に答える 3

2

ベクトル化に関する質問への回答では、答えはおそらく「はい」ですがavailable_values、ベクトル化の核心であるため、何が含まれ、どのように使用されるかを明確にする必要があります。

あなたのソリューションはおそらく次のようになります...

indices = new_data != 0

data[indices] = available_values

この場合、available_values最初の値を new_data が 0 でない最初の値に割り当てる値のセットと見なすことができれば、それは numpy 配列であるdata限り機能するはずです。available_values

たとえば、0 ~ 255 の値new_datadata取るavailable_valuesと、次のように new_data と data の値のすべての可能なペアに対して一意のエントリを持つ配列を作成できます。

available_data = numpy.array(xrange(0, 255*255)).reshape((255, 255))
indices = new_data != 0
data[indices] = available_data[data[indices], new_data[indices]]

明らかに、available_dataあなたが望むどんなマッピングでもかまいません。上記は、何が入っていても非常に高速である必要がありavailable_dataます(特に、一度しか構築しない場合available_data)。

于 2013-03-11T12:09:47.250 に答える
0

Python は、大量のデータ配列を処理するための強力なツールを提供します:ジェネレーターイテレーター

基本的に、それらは通常のリストのようにデータにアクセスできます。一度にメモリにフェッチするのではなく、少しずつアクセスします。

一度に 2 つの大きな配列にアクセスする場合は、次のことができます。

for item_a, item_b in izip(data, new_data):
   #... do you stuff here

izipは、配列の要素を一度に反復処理する反復子を作成しますが、一度にすべてではなく、必要に応じてピースを選択します。

于 2013-03-11T12:18:10.360 に答える
0

ループの最初の 2 行を置き換えると、次のようになります。

for i in numpy.where(new_data != 0)[0]:
  combo = ( data[i], new_data[i] )
  if not combo in new_values_map: new_values_map[combo] = available_values.pop()
  data[i] = new_values_map[combo]

望ましい効果があります。

そのため、ループ内のほとんどの時間は、ゼロに遭遇するとループ全体をスキップするのに費やされましたnew_data。これらの多くの null 反復がなぜそれほど高価だったのか、本当に理解できません。いつか私が...

于 2013-03-11T14:04:06.340 に答える