2016-04-30 3 views
3

私は現在、雑音が多いものを書いていますが、削除しようとしていますが、最初はマスクを使用しましたが、私はマスクを使ってデータブレークを分析しています。マスクされた配列から値を抽出してから、配列を再構築しようとするPython

マスキングが完了しました。私はマスクされていないデータを抽出し、この解析を実行してから元の順序で配列を再構築したいと考えています。

array([[3, 0, 3], 
     [6, 7, 2], 
     [2, 5, 0], 
     [2, 1, 4]]) 

メイクは

array([[-, -, -], 
     [6, 7, 2], 
     [-, -, -], 
     [2, 1, 4]]) 

エキスが

array([[6, 7, 2], 
     [2, 1, 4]]) 

分析

は、アレイ

array([[-, -, -], 
     [6, 7, 2], 
     [-, -, -], 
     [2, 1, 4]]) 
を再構築してください値をマスク

私はこれを行う効率的な方法を望んでいます。私は1億のデータポイントを扱っています。どんな提案も感謝しています。

+1

[リストの解説](https://docs.python.org/3.4/tutorial/datastructures .html#list-comprehensions)?それらは一般に、あるリストを別のリストに([http://www.diveintopython.net/power_of_introspection/filtering_lists.html])消化するために使用されます。 – Jens

+0

ありがとう、私は現在、私が必要としていると思っているcompressed()を見ているので、これを編集しようとしていました。 私が必要とするものではありませんが、x.compressed()コマンドが機能するようになりましたので、他の引数やコマンドでもできるようになります。 その後、私はアレイを再形成することができました。 – ArcAngel

答えて

4

あなたはマスクされた配列に分析された値を再割り当てする

masked[~masked.mask] = analyzed.ravel() 

を使用することができます。


import numpy as np 

arr = np.array([[3, 0, 3], 
       [6, 7, 2], 
       [2, 5, 0], 
       [2, 1, 4]]) 

masked = np.ma.masked_array(arr, mask=False) 
masked.mask[::2, None] = True 

extracted = np.ma.compress_rows(masked) 

analyzed = extracted*10 

masked[~masked.mask] = analyzed.ravel() 

print(masked) 

収率

[[-- -- --] 
[60 70 20] 
[-- -- --] 
[20 10 40]] 
+0

ありがとうございます、私はこれを試しましたが、それはcompress_rows()がスパイダーをぶら下げているようです。 それはmasked.compressed だった私が行うことができた方法() その後、平坦化配列を作成しますが、私はちょうど戻って私が必要なものにそれを再構築 。 それ以外のものは他にもありがとうございます。 – ArcAngel

2

マスクされた配列がマスクされていない値を抽出compress(ed)方法を持っている - 1Dアレイとして(一般的なマスキングに不規則であることができるため)。しかし、私は元の(または同じ形状とマスクを持つ配列)に新しい値を戻す方法についてはわかりません。 (unutbuはそのステップがカバーされているように見えます)

多くのマスク方法では、データを一時的に通常のnumpyメソッドとの変換に使用します。例えば、マスクされたバージョンsumは、マスクされた値を0で置き換えることができます。適切な塗りつぶし値は操作によって異なります。

In [86]: Am=np.ma.masked_less(A,3) 

In [87]: Am 
Out[87]: 
masked_array(data = 
[[3 -- 3] 
[6 7 --] 
[-- 5 --] 
[-- -- 4]], 
      mask = 
[[False True False] 
[False False True] 
[ True False True] 
[ True True False]], 
     fill_value = 999999) 

In [88]: Am.compressed() 
Out[88]: array([3, 3, 6, 7, 5, 4]) 

In [89]: Am.filled(999) 
Out[89]: 
array([[ 3, 999, 3], 
     [ 6, 7, 999], 
     [999, 5, 999], 
     [999, 999, 4]]) 

非マスク値スクエア:

In [97]: Am[~Am.mask]=Am.compressed()**2 

In [98]: Am 
Out[98]: 
masked_array(data = 
[[9 -- 9] 
[36 49 --] 
[-- 25 --] 
[-- -- 16]], 
      mask = 
[[False True False] 
[False False True] 
[ True False True] 
[ True True False]], 
     fill_value = 999999) 

In [99]: Am.data 
Out[99]: 
array([[ 9, 0, 9], 
     [36, 49, 2], 
     [ 2, 25, 0], 
     [ 2, 1, 16]]) 
0

あなたがちょうど使用して値を抽出することができ、配列構造を維持する必要がない場合:

masked = ... # your masked array 
valid_points = masked[~masked.mask] 

場合、または単純な配列で十分です。

valid_points_simple_array = valid_points.data 

これはNumPyが形状を保持できるかどうかを知ることができないため(これはすべての次元が同じ数の引数を持つ必要があるため)、以前の形状を無視して1Dになります。この唯一の作品

# Only complete rows were discarded 
reshaped_valid = valid_points.reshape(masked.shape[0], valid_points.size/masked.shape[0]) 

または

# or in case for columns 
reshaped_valid = valid_points.reshape(valid_points.size/masked.shape[1], masked.shape[1]) 

:しかし、一部の機能は、あなたが知っている場合にのみ有効な行/列を維持したいが、一般的に、それは再びあなたの配列を再形成するだけの問題だろうがあります完全な行または列のみを除外した場合あなたの配列の形を必要としない場合は、それを使用しないでください。

次にあなたがreshaped_validでやりたいことができますし、あなたがもう一度あなたの元の配列に割り当てることができます任意の変更を行っている場合:

後半の答えと他の回答のため申し訳ありません
masked[~masked.mask] = reshaped_valid # maybe you need to use .ravel() not sure... 

をおそらくもっと良いですが、私はいくつかのインターネット接続の問題を抱えていましたが、私はそれを破棄したくありませんでした...

関連する問題