我有一个大小为5000x10的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)


或者使用cumsumargmax-

(Num > A).cumsum(1).argmax(1)


说明:对于np.max(np.where(..),我们基本上希望获得比较中每一行上最后匹配项。

同样,我们可以使用argmax。但是,布尔数组上的argmax使我们第一次出现而不是最后一次出现。因此,一种技巧是执行比较并使用[:,::-1]翻转列,然后使用argmax。然后,将列索引减去数组中col的数量,以使其追溯到原始顺序。

在第二种方法上,它与related post非常相似,因此引用了它:

argmax的用途之一是获取max元素在数组中沿轴的第一次出现的ID。因此,我们沿行获取总和,并获得第一个最大ID,该ID代表最后一个非零元素。这是因为剩余元素上的总和不会增加最后一个非零元素之后的总和值。

关于python - 通过遍历矩阵的每一行来查找索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40009008/

10-12 21:14