这可能是一个重复的问题,但我无法找到我需要的确切解决方案。
我试图将每N行(在本例中为4)加在一起。因此,在8乘9矩阵中,我最终得到一个2乘9阵列,即将0-3行加在一起然后将行4-7加在一起。现在,这是我的解决方案,但有没有办法不使用列表理解?是否有更“笨拙”的方式来做到这一点?因为我最终得到了2个1乘9阵列的列表,而不是一个2乘9的阵列。
输入数组不是固定为8乘9,它可以是12乘9或28乘9但输入数组的总行数总是N的整数倍(其中在这个例子中是8并且N = 4)
>>> import numpy as np
>>> a = np.arange(72).reshape(8,9)
>>> a
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33, 34, 35],
[36, 37, 38, 39, 40, 41, 42, 43, 44],
[45, 46, 47, 48, 49, 50, 51, 52, 53],
[54, 55, 56, 57, 58, 59, 60, 61, 62],
[63, 64, 65, 66, 67, 68, 69, 70, 71]])
>>> b = [a[i:(i+1)*4,:] for i in range(0,len(a),4)]
>>> b
[array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33, 34, 35]]),
array([[36, 37, 38, 39, 40, 41, 42, 43, 44],
[45, 46, 47, 48, 49, 50, 51, 52, 53],
[54, 55, 56, 57, 58, 59, 60, 61, 62],
[63, 64, 65, 66, 67, 68, 69, 70, 71]])]
>>> b = [np.sum(a[i:(i+1)*4,:],axis=0) for i in range(0,len(a),4)]
>>> b
>>>[array([54, 58, 62, 66, 70, 74, 78, 82, 86]), array([198, 202, 206, 210,
214, 218, 222, 226, 230])]
答案 0 :(得分:3)
In [120]: a
Out[120]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33, 34, 35],
[36, 37, 38, 39, 40, 41, 42, 43, 44],
[45, 46, 47, 48, 49, 50, 51, 52, 53],
[54, 55, 56, 57, 58, 59, 60, 61, 62],
[63, 64, 65, 66, 67, 68, 69, 70, 71]])
In [121]: a.reshape((2, 4, 9)).sum(axis=1)
Out[121]:
array([[ 54, 58, 62, 66, 70, 74, 78, 82, 86],
[198, 202, 206, 210, 214, 218, 222, 226, 230]])
答案 1 :(得分:1)
重塑以将第一个轴分成两个,这样后一个轴的长度等于窗口长度= 4
,给我们一个3D
数组,然后沿着那个数相加,就像这样 -
a.reshape(-1,4,a.shape[-1]).sum(1)
它适用于通用形状的数组,在重塑方法中使用-1
,因为它计算自己的拆分/重新整形版本中第一个轴的长度,为我们提供了一个通用的解决方案。
运行示例以明确事项 -
# Input array with 8 rows
In [15]: a = np.arange(72).reshape(8,9)
# Get output shape
In [16]: a.reshape(-1,4,a.shape[-1]).sum(1).shape
Out[16]: (2, 9)
# Input array with 28 rows
In [17]: a = np.arange(28*9).reshape(28,9)
# Get output shape
In [18]: a.reshape(-1,4,a.shape[-1]).sum(1).shape
Out[18]: (7, 9)