第一次出现的值大于numpy数组中给出的值

时间:2016-11-02 04:25:21

标签: python arrays numpy argmax

我有一个2D数组:

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)

还有其他简化此建议吗?

2 个答案:

答案 0 :(得分:1)

表单

的嵌套列表(2d数组)
l = [[n1,n2,n3],[m1,m2,m3]...]
可以使用

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

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

答案 1 :(得分:0)

说实话,看起来很简洁。但是我觉得这可能是另一种选择:

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

末尾的部分产生一个布尔数组,表示该行中的所有项目都低于或等于默认值。

行中的任何False(因此任何超出默认值的值)都会使整个事件变为False。只有当所有值都低于默认值时,才会得到True的结果。