2016-04-15 33 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的大小相同

編輯: 這是結果我需要結束後第一個數組的子集和排名值< 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

另外:如果你使用的是命名列,你應該考慮使用熊貓DataFrame,而不是一個原始的numpy ndarray。在這種特殊情況下,它沒有那麼多的優勢,但它會在其他情況下。 – DSM

回答

1

這是那種你想要的東西(使用一維數組上一個簡單的排序)?

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

是的我認爲值是在 –