2016-07-27 10 views
3

行1に繰り返しエントリがある列を削除したいと考えています(行1の値は1 & 2.5です。削除された値の列が削除されています)。私は、その行を削除するには、その応答を使用して値がデータセットに上がっ秒(またはそれ以上)の時間のための真の応答を与え、繰り返しのチェック、いくつかの機能を使用して含ま考えていたnumpy配列の1行の繰り返し値に基づいて列を削除する

initial_array = 

row 0 [[ 1, 1, 1, 1, 1, 1, 1, 1,] 
row 1 [0.5, 1, 2.5, 4, 2.5, 2, 1, 3.5,] 
row 2 [ 1, 1.5, 3, 4.5, 3, 2.5, 1.5, 4,] 
row 3 [228, 314, 173, 452, 168, 351, 300, 396]] 

final_array = 
row 0 [[ 1, 1, 1, 1, 1, 1,] 
row 1 [0.5, 1, 2.5, 4, 2, 3.5,] 
row 2 [ 1, 1.5, 3, 4.5, 2.5, 4,] 
row 3 [228, 314, 173, 452, 351, 396]] 

方法。それはnumpy.uniqueの中でreturn index関数を使うかもしれません。私はちょうどそれを通して方法を見つけることができませんか、しかし、適切な機能を見つける。

保持されているリピートと削除されたリピートの3行目の平均値を返す方法が見つかった場合は、それはさらに優れています(下記参照)。

final_array_averaged = 
row 0 [[ 1, 1,  1, 1, 1, 1,] 
row 1 [0.5, 1, 2.5, 4, 2, 3.5,] 
row 2 [ 1, 1.5,  3, 4.5, 2.5, 4,] 
row 3 [228, 307, 170.5, 452, 351, 396]] 

困っている初心者には助けてもらえますか?

答えて

2

あなたがnp.uniqueが付属してオプションの引数を使用することができますnp.bincountを使用して最後の行を重みとして最終的な平均出力を得る -

_,unqID,tag,C = np.unique(arr[1],return_index=1,return_inverse=1,return_counts=1) 
out = arr[:,unqID] 
out[-1] = np.bincount(tag,arr[3])/C 

サンプルラン -

In [212]: arr 
Out[212]: 
array([[ 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ], 
     [ 0.5, 1. , 2.5, 4. , 2.5, 2. , 1. , 3.5], 
     [ 1. , 1.5, 3. , 4.5, 3. , 2.5, 1.5, 4. ], 
     [ 228. , 314. , 173. , 452. , 168. , 351. , 300. , 396. ]]) 

In [213]: out 
Out[213]: 
array([[ 1. , 1. , 1. , 1. , 1. , 1. ], 
     [ 0.5, 1. , 2. , 2.5, 3.5, 4. ], 
     [ 1. , 1.5, 2.5, 3. , 4. , 4.5], 
     [ 228. , 307. , 351. , 170.5, 396. , 452. ]]) 

出力は今第二列と順序がソートされていることがわかるように。それは、もともとあったようにあなたが順序を維持するために探している場合は、そのように、unqIDnp.argsort使用 -

In [221]: out[:,unqID.argsort()] 
Out[221]: 
array([[ 1. , 1. , 1. , 1. , 1. , 1. ], 
     [ 0.5, 1. , 2.5, 4. , 2. , 3.5], 
     [ 1. , 1.5, 3. , 4.5, 2.5, 4. ], 
     [ 228. , 307. , 170.5, 452. , 351. , 396. ]]) 
+0

これは完璧です、ありがとう! – georussell

1

あなたはuniqueを使用して、希望の列のインデックスを見つけることができます:

>>> indices = np.sort(np.unique(A[1], return_index=True)[1]) 

そして、欲望の列を取得するには、単純なインデックスを使用します

>>> A[:,indices] 
array([[ 1. , 1. , 1. , 1. , 1. , 1. ], 
     [ 0.5, 1. , 2.5, 4. , 2. , 3.5], 
     [ 1. , 1.5, 3. , 4.5, 2.5, 4. ], 
     [ 228. , 314. , 173. , 452. , 351. , 396. ]]) 
+0

私はちょっと前に投稿した答えです。なぜnp.sortを使うのですか? –

+0

@ColonelBeauvelいいえ、あなたの答えは注文を保存していません。 ;-)私はあなたの答えを見ませんでしたが。 – Kasramvd

+0

完全に正しいですが、注文に問題があります。 –

0

をこれがnumpy_indexedパッケージ(免責事項を使用したエレガントかつ効率的に解決することができ、一般的なグループ化の問題、である:私はその著者である):

import numpy_indexed as npi 
unique, final_array = npi.group_by(initial_array[1]).mean(initial_array, axis=1) 

平均よりも多くの削減があることに注意してください。あなたが記述した元の振る舞いを望むなら、例えば、「平均」を「最初の」と置き換えることができます。

関連する問題