通过迭代矩阵

时间:2016-10-12 21:54:10

标签: python numpy vectorization

我有一个numpy阵列' A'大小为5000x10。我还有另一个号码'Num'。我想将以下内容应用于A的每一行:

import numpy as np
np.max(np.where(Num > A[0,:]))

是否有一种pythonic方式,而不是为上面写一个for循环。

1 个答案:

答案 0 :(得分:2)

您可以使用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。然后将列索引减去数组中cols的数量,使其追溯到原始顺序。

关于第二种方法,它与related post非常相似,因此引用它:

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