Python 为什么累积对numpy.max有效,但对numpy.argmax无效
这两个看起来应该是非常等效的,因此对一个有效的应该对另一个有效?那么,为什么累加只适用于最大值,而不适用于argmaxPython 为什么累积对numpy.max有效,但对numpy.argmax无效,python,numpy,numpy-ufunc,Python,Numpy,Numpy Ufunc,这两个看起来应该是非常等效的,因此对一个有效的应该对另一个有效?那么,为什么累加只适用于最大值,而不适用于argmax 编辑:一个自然的后续问题是如何以最具pythonic/numpy风格的方式创建一个高效的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[1
编辑:一个自然的后续问题是如何以最具pythonic/numpy风格的方式创建一个高效的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])
因为在我看来,这个argmax累积的方式可以很容易地通过跟踪当前/最后一个max是什么来工作,但是你一针见血地发现,区别在于“最后一个max”正是迄今为止最大值的值,但不是argmax。作为一个旁注,
np.argmax
不是一个ufunc,还有np.max
。请注意,缺少的np.argmaximum
的拼写更好np.max
基本上是np.maximum.reduce
@Eric的别名,您能详细说明一下吗?非关联性如何成为一个问题?我甚至不明白为什么有人会首先考虑诸如<代码> ARGMAX(A,AgMAX(B,C))< /C> >,因为这样的事情对我来说完全是毫无意义的…如何跟踪累计最大值达到的指数比累计最大值本身更难?argmax
在迭代数组时,如果内部不进行累积argmax,它将如何工作?@Julien:y=f.acculate(x)
被定义为y[i]=f.reduce(x[:i+1])
而f.reduce(x)
被定义为f(x[0],f.reduce(x[1:]
。当f
为np.maximum
或np.add
时,这些公式是有意义的。当f
为np.argmin
时,这些都是无意义的,这正是argmin.acculate
不存在的原因。您可以查找最大值的跳跃。acculate
来创建argmax
如果您有任何见解,请查看我上面的评论:)@Juliennumpy
通过提供编译的构建块来提高速度,您可以组合这些构建块来执行更复杂的操作。这可能需要多次通过。和临时阵列。我在[139]
计算中的涉及到几个过程,至少有一个过程要做a==am
,另一个过程要计算非零的数量,还有一个过程要将这些索引累积到一个大小合适的数组中。