切片np.array,rankdata并返回切片的父级

时间:2016-04-15 01:47:12

标签: python arrays numpy scipy

我开始使用以下数组,即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)

1 个答案:

答案 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])