我开始使用以下数组,即3个字段的3个值的集合,我需要使用ID 123,124,126对3个对象进行排名。最终,在报告中,我将按object_id查找值和排名。
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
相同编辑: 这是我需要在获取第一个数组的子集并排名值&lt; 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')])
解
>>> 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 :(得分: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])