为什么累积工作 numpy.maximum 而不是 numpy.argmax
Why does accumulate work for numpy.maximum but not numpy.argmax
这两个看起来应该非常相似,因此对一个有效的应该对另一个有效?那么为什么 accumulate 只适用于 maximum 而不是 argmax?
编辑:一个自然而然的后续问题是如何以最 pythonic/numpy-esque 的方式创建有效的 argmax 累加?
因为max
是结合的,而argmax
不是:
max(a, max(b, c)) == max(max(a, b), c)
argmax(a, argmax(b, c)) != argmax(argmax(a, b), c)
这是你想要的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])
这两个看起来应该非常相似,因此对一个有效的应该对另一个有效?那么为什么 accumulate 只适用于 maximum 而不是 argmax?
编辑:一个自然而然的后续问题是如何以最 pythonic/numpy-esque 的方式创建有效的 argmax 累加?
因为max
是结合的,而argmax
不是:
max(a, max(b, c)) == max(max(a, b), c)
argmax(a, argmax(b, c)) != argmax(argmax(a, b), c)
这是你想要的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])