我開始使用下面的數組,這是一組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)
我會將它描述爲一個子集,而不是切片。在Python/numpy中,'slice'具有特定的含義(例如'slice(start,stop,step'或'[start:step:stop]') – hpaulj
另外:如果你使用的是命名列,你應該考慮使用熊貓DataFrame,而不是一個原始的numpy ndarray。在這種特殊情況下,它沒有那麼多的優勢,但它會在其他情況下。 – DSM