Python 为什么累积对numpy.max有效,但对numpy.argmax无效

Python 为什么累积对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

这两个看起来应该是非常等效的,因此对一个有效的应该对另一个有效?那么,为什么累加只适用于最大值,而不适用于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[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
如果您有任何见解,请查看我上面的评论:)@Julien
numpy
通过提供编译的构建块来提高速度,您可以组合这些构建块来执行更复杂的操作。这可能需要多次通过。和临时阵列。我在[139]
计算中的
涉及到几个过程,至少有一个过程要做
a==am
,另一个过程要计算非零的数量,还有一个过程要将这些索引累积到一个大小合适的数组中。