我有一个Python数组,想要计算每五个元素的总和。在我的案例中,我有一个带有十个元素的数组c。(实际上它有更多元素。)
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
所以最终我想要一个新数组 (c_new
),它应该显示前5个元素和后5个元素的总和。
所以结果应该是这样的一种情况。
1+0+0+0+0 = 1
2+0+0+0+0 = 2
c_new = [1, 2]
感谢您的帮助 Markus
我有一个Python数组,想要计算每五个元素的总和。在我的案例中,我有一个带有十个元素的数组c。(实际上它有更多元素。)
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
所以最终我想要一个新数组 (c_new
),它应该显示前5个元素和后5个元素的总和。
所以结果应该是这样的一种情况。
1+0+0+0+0 = 1
2+0+0+0+0 = 2
c_new = [1, 2]
感谢您的帮助 Markus
np.add.reduceat
,通过传递您想要拆分和求和的索引:import numpy as np
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
np.add.reduceat(c, np.arange(0, len(c), 5))
# array([1, 2])
这是一种方法 -
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
print [sum(c[i:i+5]) for i in range(0, len(c), 5)]
结果 -
[1, 2]
[sum(x for x in c[i*5:5*(i+1)]) for i in range(len(c)//5)]
,但你的更好。 - Ma0[sum(group) for group in grouper(c, 5, 0)]
。虽然在这里可能有些过度。 - Peter DeGloppernp.reshape(c, (-1, 5)).sum(axis=-1)
即使它是非连续的,它也能工作,但通常效率较低。
基准测试:
def aredat():
return np.add.reduceat(c, np.arange(0, len(c), 5))
def reshp():
np.reshape(c, (-1, 5)).sum(axis=-1)
c = np.random.random(10_000_000)
timeit(aredat, number=100)
3.8516048429883085
timeit(reshp, number=100)
3.09542763303034
因此,在可能的情况下,reshape
似乎更快一些;reduceat
的优点是可以优雅地处理非五的倍数向量。
.sum
可以说是最主流的函数之一。它应该已经进行了大量的优化! - Paul Panzer有多种方法可以实现这一点。以下将介绍两种使用numpy
内置方法的选项。
选项1
使用numpy.sum
和numpy.ndarray.reshape
函数,如下所示:
c_sum = np.sum(np.array(c).reshape(-1, 5), axis=1)
[Out]: array([1, 2])
选项2
使用numpy.vectorize
、自定义lambda函数和numpy.arange
,如下所示:
c_sum = np.vectorize(lambda x: sum(c[x:x+5]))(np.arange(0, len(c), 5))
[Out]: array([1, 2])
np.array([np.sum(i, axis = 0) for i in c.reshape(c.shape[0]//5,5,c.shape[1])])