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

Python 查找(并记录)numpy数组切片的最大值,python,arrays,numpy,max,Python,Arrays,Numpy,Max,给定一个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模块沿适当的轴取最大值,但是,同样,我不确定如何处理3的最后倍数之后的

给定一个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模块沿适当的轴取最大值,但是,同样,我不确定如何处理3的最后倍数之后的值

第一次使用
np.pad

a = np.pad(a, [0, 1], mode='constant')
>>> np.max(a.reshape(-1, 3), axis=1)
array([3, 4, 3, 6])
然后
重塑
最大值

a = np.pad(a, [0, 1], mode='constant')
>>> np.max(a.reshape(-1, 3), axis=1)
array([3, 4, 3, 6])
要概括这一点,只需计算填充,以便将形状重塑为所需的尺寸。

方法#1

我们可以使用来执行此类分组/区间缩减操作。因此,要获得每个间隔内的
最大值,我们需要-

W = 3 # group width
np.maximum.reduceat(a,np.r_[:len(a):W])
样本运行-

In [166]: a
Out[166]: array([0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2])

In [167]: W = 3

In [168]: np.maximum.reduceat(a,np.r_[:len(a):W])
Out[168]: array([3, 4, 3, 6])
方法#2

下面是另一个带有
切片的
-

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])

为了最大限度地减少需要重新分配的数量,您可以计算适合3的倍数的所有元素的最大值,然后计算剩余元素的最大值。此解决方案并不简单,但不会创建不必要的数据副本:

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()

这是最简单直接的解决方案+1因此,无论你创建一个copyYep让我多么恼火,这都是这种方法的一个缺点。我试着用一些跨步技巧来做到这一点,但没有运气:减量解决方案是完美的。不过,我找到了一种在没有临时数组的情况下进行切片的方法。如何在不复制数组部分的情况下进行切片?@ed22 slicing不进行任何复制。不确定你指的是哪一份复印件。