【问题标题】:first occurence of a value greater than given in numpy array第一次出现大于 numpy 数组中给定值的值
【发布时间】:2016-11-02 04:25:21
【问题描述】:

我有一个像这样的二维数组:

r1= np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]])

我需要为每一行找到第一次出现的大于默认值的值。我正在使用这个:

default=2
ans= np.argmax(r1>default,1)

问题在于,如果存在大于默认值的值,则它可以工作,但如果找不到这样的值,则返回零。所以它在 2 种情况下返回零 - 1)每行第一个值大于默认值 2) 每个值都没有大于默认值

#simple case:
In[31]: np.argmax(r1>2,1)
Out[31]: array([2, 1, 0], dtype=int64)

#trouble case- both returning zeros
In[32]: np.argmax(r1>7,1)
Out[32]: array([0, 0, 0], dtype=int64)
In[33]: np.argmax(r1>0.5,1)
Out[33]: array([0, 0, 0], dtype=int64)

我目前正在使用它来解决这个问题:

In[37]: np.any(r1>7,1) + np.argmax(r1>7,1)-1
Out[37]: array([-1, -1, -1], dtype=int64)
In[38]: np.any(r1>0.5,1) + np.argmax(r1>0.5,1)-1
Out[38]: array([0, 0, 0], dtype=int64)

还有什么可以简化的建议吗?

【问题讨论】:

  • 你必须至少使用一个函数和argmax(),所以我觉得这很整洁。

标签: python arrays numpy argmax


【解决方案1】:

形式的嵌套列表(二维数组)

l = [[n1,n2,n3],[m1,m2,m3]...]

可以遍历每个嵌套列表中大于给定数字“d”的第一个值

[[i for i in x if i>d][0] for x in l]

【讨论】:

  • 谢谢,这对于我想要实际值的情况很有用。不回答这个问题,我想要这些值的索引,并且在找不到值的情况下不想要错误。还是个不错的技巧
  • 抱歉很久没有登录了。也可以为索引完成。 [y for y in [[x.index(i) for i in x if i>d] for x in l] if len(y)>0 ]
【解决方案2】:

说实话,看起来已经很简洁了。但这里有一个我认为可能可行的替代方案:

ans = np.argmax(r1>default,1) - (np.amin(r1<=default,1))

最后的部分产生一个布尔数组,指示行中的所有项目何时低于或等于您的默认值。

行中的任何 False(因此任何高于默认值的值)都会使整个事情 False。只有当所有值都低于默认值时,我们才会得到 True 的结果。

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 2018-06-30
    • 2020-11-26
    • 2021-06-03
    • 2023-03-12
    • 2016-08-25
    • 2016-12-21
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多