gpt4 book ai didi

Numpy 最大值的索引减少 - numpy.argmax.reduceat

转载 作者:行者123 更新时间:2023-12-01 09:37:44 24 4
gpt4 key购买 nike

我有一个平面阵列 b :

a = numpy.array([0, 1, 1, 2, 3, 1, 2])

还有一个数组 c标记每个“ block ”开始的索引:

b = numpy.array([0, 4])

我知道我可以使用归约找到每个“ block ”中的最大值:

m = numpy.maximum.reduceat(a,b)
>>> array([2, 3], dtype=int32)

但是...有没有办法找到最大<edit>的索引?在一个 block 内 </edit> (如 numpy.argmax ),使用矢量化操作(无列表、循环)?

最佳答案

借用 this post 的想法.

涉及的步骤:

  • 按限制偏移量偏移组中的所有元素。对它们进行全局排序,从而限制每个组停留在它们的位置,但对每个组内的元素进行排序。

  • 在已排序的数组中,我们将查找最后一个元素,即组最大值。它们的索引将是向下抵消组长度后的 argmax。

因此,矢量化实现将是 -

def numpy_argmax_reduceat(a, b):
n = a.max()+1 # limit-offset
grp_count = np.append(b[1:] - b[:-1], a.size - b[-1])
shift = n*np.repeat(np.arange(grp_count.size), grp_count)
sortidx = (a+shift).argsort()
grp_shifted_argmax = np.append(b[1:],a.size)-1
return sortidx[grp_shifted_argmax] - b

作为一个小的调整,可能会更快,我们可以选择使用 cumsum 创建 shift,从而得到早期方法的变体,就像这样 -

def numpy_argmax_reduceat_v2(a, b):
n = a.max()+1 # limit-offset
id_arr = np.zeros(a.size,dtype=int)
id_arr[b[1:]] = 1
shift = n*id_arr.cumsum()
sortidx = (a+shift).argsort()
grp_shifted_argmax = np.append(b[1:],a.size)-1
return sortidx[grp_shifted_argmax] - b

关于Numpy 最大值的索引减少 - numpy.argmax.reduceat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41833740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com