如何在Python的NumPy数组中计算n个元素的总和?

3

假设我有一个n行d列的Python数组,例如a=np.array([[1,2,3],[4,5,6], [7,8,9], [10,11,12], [13,14,15]])

在这种情况下,n=5,d=3,并且假设我有一个比n小或等于n的数字c。我想要计算以下内容:

独立考虑每一列并计算每个c值的总和;例如,如果c=2,则解决方案将是

solution=np.array([[1+4, 2+5, 3+6], [7+10,8+11,9+12]])

最后一行被跳过,因为5 mod 2 = 1,所以我们需要在最后留下一行;

如果c=1,则解决方案将是原始数组,例如c=3时,解决方案将是

solution=np.array([[1+4+7, 2+5+8, 3+6+9]]),最后两行被省略;

那么最优雅且高效的解决方案是什么?我在网上搜索了很多,但找不到类似的问题。

1个回答

4

以下是一种方法 -

def sum_in_blocks(a, c):
    # Get extent of each col for summing
    l = c*(len(a)//c)

    # Reshape to 3D considering first l rows, and "cutting" after each c rows
    # Then sum along second axis
    return a[:l].reshape(-1,c,a.shape[1]).sum(1)

有关第二步的更多信息 - nd到nd转换的一般思路

示例运行 -

In [79]: a
Out[79]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15]])

In [80]: sum_in_blocks(a, c=1)
Out[80]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15]])

In [81]: sum_in_blocks(a, c=2)
Out[81]: 
array([[ 5,  7,  9],
       [17, 19, 21]])

In [82]: sum_in_blocks(a, c=3)
Out[82]: array([[12, 15, 18]])

给定样例的解释

In [84]: a
Out[84]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15]])

In [85]: c = 2

In [87]: l = c*(len(a)//c) # = 4; Get extent of each col for summing

In [89]: a[:l] # hence not relevant rows are skipped
Out[89]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

# Reshape to 3D "cutting" after every c=2 rows
In [90]: a[:l].reshape(-1,c,a.shape[1])
Out[90]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

# Sum along axis=1 for final o/p
In [91]: a[:l].reshape(-1,c,a.shape[1]).sum(axis=1)
Out[91]: 
array([[ 5,  7,  9],
       [17, 19, 21]])

我不知道你在第二步做了什么,但我将其应用于我的数据,它像魔法一样奏效。谢谢。 - Mark
@Mark 添加了一个使用示例的逐步说明。这应该使理解更容易。 - Divakar

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