【问题标题】:Why does accumulate work for numpy.maximum but not numpy.argmax为什么累积对 numpy.maximum 有效,但对 numpy.argmax 无效
【发布时间】:2016-06-16 09:24:58
【问题描述】:

这两个看起来应该非常等价,因此对一个有效的对另一个有效?那么为什么累积只对最大值起作用而不对argmax起作用呢?

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

【问题讨论】:

  • 您可以在maximum.accumulate 中查找跳转以创建argmax 数组。

标签: python numpy numpy-ufunc


【解决方案1】:

因为max 是关联的,但argmax 不是:

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

【讨论】:

  • 因为在我看来,这个 argmax 累积的方式可以通过跟踪当前/最后一个最大值来轻松工作,但是你一针见血,区别在于“最后一个max" 是迄今为止的最大值,但不是 argmax。
  • 附带说明,np.argmaxnp.max 都不是 ufunc。请注意,不存在的np.argmaximum 最好拼写为<
  • np.max 基本上是np.maximum.reduce 的别名。
  • @Eric 你能详细说明一下吗?非关联性如何成为问题?我什至不明白为什么有人会首先考虑像argmax(a, argmax(b, c)) 这样的事情,因为这样的事情对我来说完全没有意义......如何跟踪达到累积最大值的索引比那个累积更难最大本身? argmax 在遍历数组时如何在内部不进行累积 argmax 的情况下工作?
  • @Julien:y = f.accumulate(x) 定义为y[i] = f.reduce(x[:i+1])f.reduce(x) 定义为f(x[0], f.reduce(x[1:])。当fnp.maximumnp.add 时,这些公式是有意义的。当fnp.argmin 时,那些都是废话,这正是argmin.accumulate 不存在的原因。
【解决方案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])

【讨论】:

  • 如果您有任何见解,请查看我上面的评论 :)
  • @Julien numpy 通过提供已编译的构建块来提高速度,您可以将它们组合起来执行更复杂的操作。这很可能需要多次通过。和临时数组。我的In[139] calc 涉及多次传递,至少一次执行a==am,另一次计算非零的数量,另一次将这些索引累积到正确大小的数组中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2023-03-09
  • 2017-08-31
  • 2022-01-12
  • 2020-05-14
  • 2020-10-07
相关资源
最近更新 更多