具有特定步长的二维数组的行总和-NumPy

具有特定步长的二维数组的行总和-NumPy,numpy,Numpy,这是一个快速的。我想知道是否有更好的方法来表达以下行(除了使用短循环): 重塑将第一个轴拆分为两个,然后沿这两个轴中的第一个轴求和,如下所示- energy = signal.reshape(-1,4,signal.shape[1]).sum(0) 样本运行- In [327]: np.random.seed(0) In [328]: signal = np.random.randint(0,9,(8,5)) In [329]: energy = np.zeros((4, signal.s

这是一个快速的。我想知道是否有更好的方法来表达以下行(除了使用短循环):


重塑将第一个轴拆分为两个,然后沿这两个轴中的第一个轴求和,如下所示-

energy = signal.reshape(-1,4,signal.shape[1]).sum(0)
样本运行-

In [327]: np.random.seed(0)

In [328]: signal = np.random.randint(0,9,(8,5))

In [329]: energy = np.zeros((4, signal.shape[1]))
     ...: energy[0::4, 0:] = np.sum(signal[0::4, :], axis=0)
     ...: energy[1::4, 0:] = np.sum(signal[1::4, :], axis=0)
     ...: energy[2::4, 0:] = np.sum(signal[2::4, :], axis=0)
     ...: energy[3::4, 0:] = np.sum(signal[3::4, :], axis=0)

In [330]: energy
Out[330]: 
array([[ 13.,   4.,   6.,   3.,  10.],
       [  8.,   5.,   4.,   7.,  15.],
       [  7.,  11.,  11.,   4.,  13.],
       [  7.,   8.,   8.,   5.,  12.]])

In [331]: signal.reshape(-1,4,signal.shape[1]).sum(0)
Out[331]: 
array([[13,  4,  6,  3, 10],
       [ 8,  5,  4,  7, 15],
       [ 7, 11, 11,  4, 13],
       [ 7,  8,  8,  5, 12]])

对于行数不一定是
4
倍数的数组,这里是通用版本-

m = signal.shape[0]
n = m//4
energy = signal[:n*4].reshape(n,4,-1).sum(0)
energy[:m%4] += signal[n*4:]
m = signal.shape[0]
n = m//4
energy = signal[:n*4].reshape(n,4,-1).sum(0)
energy[:m%4] += signal[n*4:]