我有一个numpy阵列' A'大小为5000x10
。我还有另一个号码'Num'
。我想将以下内容应用于A的每一行:
import numpy as np
np.max(np.where(Num > A[0,:]))
是否有一种pythonic方式,而不是为上面写一个for循环。
答案 0 :(得分:2)
您可以使用argmax
-
A.shape[1] - 1 - (Num > A)[:,::-1].argmax(1)
或者使用cumsum
和argmax
-
(Num > A).cumsum(1).argmax(1)
说明:使用np.max(np.where(..)
,我们基本上希望在比较的每一行中获得最后一次匹配。
同样,我们可以使用argmax
。但是,布尔数组上的argmax
给出了第一个匹配项而不是最后一个匹配项。因此,一个技巧是执行比较并使用[:,::-1]
翻转列,然后使用argmax
。然后将列索引减去数组中cols的数量,使其追溯到原始顺序。
关于第二种方法,它与related post
非常相似,因此引用它:
argmax的一个用途是获取max元素沿阵列中轴的第一个出现的ID。因此,我们沿着行获得cumsum并获得第一个最大ID,它代表最后一个非零元素。这是因为剩余元素上的cumsum不会在最后一个非零元素之后增加和值。