我有一个2D numpy数组,看起来类似于:
np.array([
[5, 4, 3, 2, 1],
[4, 3, 3, 3, 3],
[4, 4, 2, 5, 1],
[2, 2, 2, 2, 1]
])
我想找到违反条件的第一个值的索引,如果它们都满足条件,则返回maximum index + 1
。例如,我想找到条件value >=3
为false的第一个索引。
在
ls = [5,4,3,2,1]
中,它将是3,因为value>=3
为false的第一个索引是具有值的ls[3]
2
。在
ls = [4,3,3,3,3]
中,由于列表中的所有值都满足value >=3
,因此返回最大索引+1,即5。因此,对于
ls= [4,4,2,5,1]
,它将是2,因为第一个索引违反该条件的是作为值CCD_ 11的CCD_。因此,对于
ls= [2,2,2,2,1]
,它将是0,因为第一个索引违反该条件的是值CCD_ 14的CCD_。
我当前的尝试应用我的条件创建布尔掩码,然后使用np.argmin()
查找第一个false
值的索引
np.apply_along_axis(
lambda x: np.argmin(x>=3),
1,
np.array([
[5, 4, 3, 2, 1],
[4, 3, 3, 3, 3],
[4, 4, 3, 5, 1],
[2, 2, 2, 2, 1]
])
)
但这会输出array([3, 0, 2, 0])
,因为当数组中的所有值都满足条件时,此方法无法处理第二种情况。有更好的方法吗?请记住,这必须应用于数千个这样的阵列,因此理想情况下必须将复杂性保持在最低限度。
这里有一种方法-
In [60]: a
Out[60]:
array([[5, 4, 3, 2, 1],
[4, 3, 3, 3, 3],
[4, 4, 2, 5, 1],
[2, 2, 2, 2, 1]])
In [61]: m = a<3
In [62]: np.where(m.any(1),m.argmax(1),a.shape[1])
Out[62]: array([3, 5, 2, 0])