假设我有以下数组:
a = np.array([[1,2,3,4,5,6],
[7,8,9,10,11,12],
[3,5,6,7,8,9]])
我想对第一行的前两个值求和:1+2 = 3
,然后接下来的两个值:3+4 = 7
,然后是5+6 = 11
,依此类推每一行。我想要的输出是:
array([[ 3, 7, 11],
[15, 19, 23],
[ 8, 13, 17]])
我有以下解决方案:
def sum_chunks(x, chunk_size):
rows, cols = x.shape
x = x.reshape(x.size / chunk_size, chunk_size)
return x.sum(axis=1).reshape(rows, cols/chunk_size)
但感觉不必要的复杂,有更好的方法吗?也许是内置的?
答案 0 :(得分:6)
只需使用切片:
a[:,::2] + a[:,1::2]
这将获取每个偶数索引列(::2
)形成的数组,并将其添加到由每个奇数索引列(1::2
)形成的数组中。
答案 1 :(得分:6)
当我必须做这种事情时,我更喜欢将2D阵列重塑为3D阵列,然后使用np.sum
折叠额外的维度。将其推广到n维数组,你可以这样做:
def sum_chunk(x, chunk_size, axis=-1):
shape = x.shape
if axis < 0:
axis += x.ndim
shape = shape[:axis] + (-1, chunk_size) + shape[axis+1:]
x = x.reshape(shape)
return x.sum(axis=axis+1)
>>> a = np.arange(24).reshape(4, 6)
>>> 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]])
>>> sum_chunk(a, 2)
array([[ 1, 5, 9],
[13, 17, 21],
[25, 29, 33],
[37, 41, 45]])
>>> sum_chunk(a, 2, axis=0)
array([[ 6, 8, 10, 12, 14, 16],
[30, 32, 34, 36, 38, 40]])
答案 2 :(得分:1)
这是一种方式:
>>> a[:,::2] + a[:,1::2]
array([[ 3, 7, 11],
[15, 19, 23],
[ 8, 13, 17]])
答案 3 :(得分:0)
>>> def sum_chunks(x, chunk_size):
shape = list(x.shape)
reshape = shape[:-1] + [-1, chunk_size]
return x.reshape(*reshape).sum(axis=-1)
>>>
>>> # Example usage:
>>> y = np.arange(0, 18, 1).reshape(3, 6)
>>> y
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
>>>
>>> sum_chunks(y, 3)
array([[ 3, 12],
[21, 30],
[39, 48]])
>>>
>>> sum_chunks(y, 2)
array([[ 1, 5, 9],
[13, 17, 21],
[25, 29, 33]])