查找(并记录)numpy数组切片的最大值

2024-04-19 23:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个numpy数组,比如a = [0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2],有没有一种简单的方法来记录每3个值的最大值?数组的长度不能是3的倍数。在这种情况下,结果应该是b = [3, 4, 3, 6]。在

我想到了一些

b = [max(a[k:k+3]) for k in range(0, len(a), 3)

但它没有考虑最后一个3的倍数之后的值(应该是这样)。在

我还考虑过重新排列numpy数组,使其具有3*n行,并使用numpy模块沿着适当的轴获取maxima,但是,再次声明,我不确定如何处理最后乘以3之后的值。在


Tags: 模块方法innumpy声明forlen记录
3条回答

首先使用np.pad

a = np.pad(a, [0, 1], mode='constant')

然后reshapemax

^{pr2}$

为了推广这一点,只需计算填充,以便将其重塑为所需的维度。在

为了最小化需要进行的重新分配量,可以计算所有元素的最大值,然后再计算余数的最大值。此解决方案不那么简单,但不会创建不必要的数据副本:

n = 3  # The group width
prefix, suffix = divmod(a.size, n)
output = np.empty(prefix + bool(suffix))
a[:n * prefix].reshape(-1, n).max(axis=1, out=output[:prefix])
if suffix:
    output[-1] = a[-suffix:].max()

方法

我们可以使用^{}来执行这样的分组/内部归约操作。因此,要在每个间隔内得到maximum值,我们需要-

W = 3 # group width
np.maximum.reduceat(a,np.r_[:len(a):W])

样本运行-

^{pr2}$

方法2

这是另一个带有slicing-

def max_interval_slice(a, W=3):
    n = len(a)//W
    max0 = a[:n*W].reshape(-1,W).max(1)
    if n*W==len(a):
        return max0
    else:
        return np.r_[max0, np.max(a[n*W:])]

样本运行-

# Input array of length NOT multiple of width=3
In [99]: a
Out[99]: array([0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2])

In [100]: max_interval_slice(a, W=3)
Out[100]: array([3, 4, 3, 6])

# Input array of length multiple of width=3
In [95]: a = a[:9]

In [96]: max_interval_slice(a, W=3)
Out[96]: array([3, 4, 3])

相关问题 更多 >