numpy.array的求和部分

8

假设我有以下数组:

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)

但感觉这样做过于复杂,有没有更好的方法?也许有内置的方法吗?
3个回答

8

只需使用切片:

a[:,::2] + a[:,1::2]

这段代码将由偶数索引列(::2)形成的数组与由奇数索引列(1::2)形成的数组相加。


谢谢,对于“2”的情况,切片很好用,但是对于一般解决方案来说,它仍然像之前那样好用吗? - Akavall
如果你需要对n个连续的列求和,你可以使用np.sum([a[:,i::n] for i in xrange(n)], 0)。你如何将其泛化? - nneonneo
你的方案更简洁易读,但是我计时后发现我的初始方案更快。 - Akavall
@Akavall:我的答案中的代码在n=2时比你的sum_chunks更快。对于更大的n,可能会有其他更快的解决方案。我的注释解决方案只是一个示例,但我并不打算进行优化。 - nneonneo

7

当我需要处理这种类型的内容时,我更喜欢将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]])

1

Here's one way:

>>> a[:,::2] + a[:,1::2]
array([[ 3,  7, 11],
       [15, 19, 23],
       [ 8, 13, 17]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接