为什么累积工作numpy.maximum但不是numpy.argmax

时间:2016-06-16 09:24:59

标签: python numpy numpy-ufunc

这两个看起来应该是非常相同的,因此适合一个的应该适用于另一个?那么为什么积累只能用于最大值而不是argmax?

编辑:一个自然的后续问题是如何创建一个有效的argmax以最pythonic / numpy-esque的方式积累?

2 个答案:

答案 0 :(得分:4)

由于max是关联的,但argmax不是:

  • max(a, max(b, c)) == max(max(a, b), c)
  • argmax(a, argmax(b, c)) != argmax(argmax(a, b), c)

答案 1 :(得分:2)

这是你想要的那种argmax积累吗?

示例数组:

In [135]: a
Out[135]: array([4, 6, 5, 1, 4, 4, 2, 0, 8, 4])

你已经获得的最大值:

In [136]: am=np.maximum.accumulate(a)    
In [137]: am
Out[137]: array([4, 6, 6, 6, 6, 6, 6, 6, 8, 8], dtype=int32)

In [138]: a1=np.zeros_like(a)

识别am跳跃的元素。 np.diff也会有效:

In [139]: ind=np.nonzero(a==am)[0]

In [140]: ind
Out[140]: array([0, 1, 8], dtype=int32)

In [141]: a1[ind]=ind    
In [142]: a1
Out[142]: array([0, 1, 0, 0, 0, 0, 0, 0, 8, 0])

In [143]: np.maximum.accumulate(a1)
Out[143]: array([0, 1, 1, 1, 1, 1, 1, 1, 8, 8], dtype=int32)

查找ind的替代方式 - 寻找am

中的跳转
In [149]: ind=np.nonzero(np.diff(am))

In [150]: ind = np.concatenate([[0],ind[0]+1])

In [151]: ind
Out[151]: array([0, 1, 8])