代码之家  ›  专栏  ›  技术社区  ›  Hans Wurst

Numpy查找数组小范围内最大值的索引

  •  2
  • Hans Wurst  · 技术社区  · 6 年前

    我有一个二维数组

     data = array([
           [  0.23        ,   0.61070541],
           [  1.12        ,   0.94622007],
           [  2.33        ,   0.20868555],
           [  3.23        ,   0.26452314],
           [  4.67        ,   0.93988767],
           [  5.17        ,   0.05736691],
           [  6.74        ,   0.54063927],
           [  7.58        ,   0.3045981 ],
           [  8.48        ,   0.13873822],
           [  9.47        ,   0.27759926],
           [ 10.12        ,   0.27030156]])
    

    我想在第二列中找到最大值,限制在第一列给出的间隔内。我想查看第5到8行,并在第二列中找到最大值的最大行索引。在第6行的给定数据集中,数据[6]=6,0.54063927. 我的目标是使用numpy获得索引6。到目前为止我已经做到了

    data_interval = data[ np.where( (data[:,0] > 5) & data[:,0] < 9 ) ]
    max_interval = data_interval.max(axis = 0)[1]
    index = np.where(data == [None, max_interval])[0]
    

    如果最大值在间隔之外的数据中没有再次出现,则此操作有效。否则我会进入最后一个np。其中调用多个索引。总的来说,这感觉很笨拙,我想知道是否有一种更快的方法可以只生成区间内的指数。 我想要总数据数组的绝对索引 ,而不是data\u interval数组的索引。 一般来说,我发现很难在numpy中对数据进行排序/搜索,因为一旦数据在一个数组中组合在一起,就很难根据x或y对数据集进行成对排序(x,y)。欢迎提供处理此类问题的提示/建议。

    1 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    我们可以先这样做 屏蔽掉 条件所在的值 按住,然后使用 argmax ,以计算第二列为最大值的索引。

    因此,我们使用以下方法进行遮罩:

    data_masked = np.ma.masked_where((data[:,0] < 5) | (data[:,0] > 9), data[:,1])
    

    所以这里的条件是 对面的 筛选条件的:所有行 data[:0] < 5 data[:0] > 9 都被遮住了。请注意,我们已经对第二列进行了投影。中间结果为:

    >>> np.ma.masked_where((data[:,0] < 5) | (data[:,0] > 9), data[:,1])
    masked_array(data=[--, --, --, --, --, 0.05736691, 0.54063927, 0.3045981,
                       0.13873822, --, --],
                 mask=[ True,  True,  True,  True,  True, False, False, False,
                       False,  True,  True],
           fill_value=1e+20)
    

    然后我们用以下公式计算指数:

    index = np.argmax(b)