我有一个大小为5000×10的numpy数组’A’.我还有另一个数字“ Num”.我想将以下内容应用于A的每一行:
import numpy as np
np.max(np.where(Num > A[0,:]))
是否有比上面编写for循环更有效的Python方法.
解决方法:
您可以使用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.因此,我们沿行获得了总和,并获得了第一个最大ID,该ID代表了最后一个非零元素.这是因为剩余元素上的总和不会增加最后一个非零元素之后的总和值.