2016-04-15 16 views
0

3つのフィールドの3つの値のセットで、3つのオブジェクトのIDを123,124,126にする必要があります。最終的に、私はobject_idによって値とランクを調べます。np.array、rankdataをスライスしてスライスの親にランク付け

ha = np.array(
     [ 
     (123,5,3,4), 
     (124,4,999,3), 
     (126,6,5,999) 
     ], dtype=[ 
     ('object_id','int8'),('val1','int16'), 
     ('val2','int16'),('val3','int16')]) 

私はそれらをランク付けしてそのデータを保存する方法を正確にはわかりません。私の計画では、この配列のコピーを作成し、scipy.stats.rankdataを使ってフィールドとランクの値をランク付けしました。

ra = np.copy(ha) 
ra['val1'] = rankdata(ha['val1'], method='min').astype(int) 

これは、オブジェクトが特定のフィールドの値を持っていないとき、それは999にデフォルト設定し、これらのオブジェクトがランキングから削除する必要がある場合を除いて動作します。今

ra = np.copy(ha) 
subset = ha[np.where(ha['val1'] < 999) 
ranks = rankdata(subset['val1'], method='min').astype(int) 

私の問題をどのように正しい位置に戻って私のRA配列にランク値を取得する:これは私のコードが今どのように見えるのですか?これはhaのサブセットです。つまり、もはやhaまたはraと同じサイズではありません。

EDIT: これは、最初の配列のサブセットを取ってから値を< 999最低から最高まで。

ra = np.array(
      [ 
      (123,2,1,2), 
      (124,1,0,1), 
      (126,3,2,0) 
      ], dtype=[ 
      ('object_id','int8'),('val1','int16'), 
      ('val2','int16'),('val3','int16')]) 

SOLUTION

>>> ha = np.array(
     [ 
     (123,5,3,4), 
     (124,4,999,3), 
     (126,6,5,999) 
     ], dtype=[ 
     ('object_id','int8'),('val1','int16'), 
     ('val2','int16'),('val3','int16')]) 
>>> c = np.copy(ha) 
>>> i = ha['val2']<999 
>>> c['val2'] = 0 
>>> c['val2'][i] = rankdata(ha['val2'][i], method='max').astype(int) 
>>> c['val2'] 
    array([1, 0, 2], dtype=int16) 
+0

私はそれをスライスではなくサブセットとして説明します。 Python/numpy 'slice'には特別な意味があります(例えば、' slice(start、stop、step'または '[start:step:stop]') – hpaulj

+0

名前付き列で作業する場合は、 – DSM

答えて

1

これはあなたが望むものの一種である(1Dアレイ上の単純なソートを使用して)?

In [14]: x=np.array([1,0,999,3,2]) 

In [15]: i=x<999 

In [16]: np.sort(x[i]) 
Out[16]: array([0, 1, 2, 3]) 

In [17]: y=x.copy() 

In [18]: y[i]=np.sort(x[i]) 

In [19]: y 
Out[19]: array([ 0, 1, 999, 2, 3]) 
+0

新しい配列は、順序付けされた値だけでなく実際のランク位置の値を持つ必要があるため、正確ではありません。例:[3,5,2] => [2,3,1] –

+0

しかし、私は正しい場所に値を入れていますか?私は値自体に焦点を当てていません。 – hpaulj

+0

はい、値は –

関連する問題