【问题标题】:Numpy Find Index of Maximum Value inside small range of arrayNumpy在数组的小范围内查找最大值索引
【发布时间】:2018-07-27 12:45:36
【问题描述】:

我有一个二维数组的形式

 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 行的给定数据集中,data[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.where 调用多个索引。总的来说,这感觉很笨拙,我想知道是否有更快的方法只产生区间中的索引。 我想要相对于总数据数组的绝对索引,而不是 data_interval 数组的索引。 通常,我发现很难在 numpy 中对数据集进行排序/搜索数据,这些数据集是成对的,例如 (x,y) 仅基于 x 或 y 一旦数据一起在一个数组中。欢迎提供处理此类问题的提示/建议。

【问题讨论】:

    标签: python numpy search max intervals


    【解决方案1】:

    我们可以通过首先屏蔽条件成立的值,然后使用argmax来计算第二列所在的索引最大值。

    所以我们用:

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

    所以这里的条件是过滤条件的相反data[:0] &lt; 5data[:0] &gt; 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)
    

    【讨论】:

    • 谢谢,我之前自己尝试过使用蒙版,但不知道如何将蒙版正确应用于第二列。其他掩码函数的工作方式是否类似并掩码作为辅助参数传递的数据?
    • @HansWurst:这个想法是,对于被屏蔽的元素,值不可用,因此这意味着 - 从概念上讲 - 他们无权访问元素 afaik。
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2021-05-11
    • 2016-12-09
    • 2012-12-01
    • 2019-02-11
    相关资源
    最近更新 更多