假设我有一个包含10个值的numpy数组a
。这里只是一个示例情况,虽然我想对长度为100的数组重复相同的事情。
a = np.array([1,2,3,4,5,6,7,8,9,10])
我想将前5个值和后面的5个值相加,依此类推,并将它们存储在一个新的空列表中,如b
。
因此b
将包含b = [15,40]
。
我该怎么做呢?
答案 0 :(得分:10)
一种方法是使用add
ufunc及其reduceat
方法:
>>> np.add.reduceat(a, [0,5])
array([15, 40])
这会对切片a[0:5]
和a[5:]
求和并返回一个新数组。
如果你想要一个Python列表,你可以在返回的数组上调用tolist()
。
您可以使用该方法的任何索引列表(并且它们不必均匀间隔)。例如,如果您希望每次在长度为100的数组上切片为5:
>>> b = np.arange(100)
>>> np.add.reduceat(b, range(0, 100, 5))
array([ 10, 35, 60, 85, 110, 135, 160, 185, 210, 235, 260, 285, 310,
335, 360, 385, 410, 435, 460, 485])
答案 1 :(得分:4)
试试这个列表理解:
b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
从列表中一次获取5个切片,将它们相加并构造一个列表。也适用于长度不超过5的列表。
(xrange
应该是range
在python3 +中)
答案 2 :(得分:4)
这是(还)另一种解决方案:
In [3]: a.reshape((2,5)).sum(axis=1)
Out[3]: array([15, 40])
将一维数组重新整形为两行,每列5列,并对列进行求和:
In [4]: a.reshape((2,5))
Out[4]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
每行的总和(对列条目求和)用axis=1
指定。重塑不会复制数据(并且不会修改原始a
),因此效率很高。
答案 3 :(得分:1)
您可以使用
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
step = 5
for i in range(0,a.shape[0],step):
print(np.sum(a[i:i+step]))
答案 4 :(得分:0)
在您的特定情况下,计算 5 个连续元素的总和:
a = np.array([1,2,3,4,5,6,7,8,9,10])
print(a.reshape((-1,5)).sum(axis=1))
通常,要对 N 个连续元素执行 numpy 数组操作 oper(例如 mean
或 max
):
print(a.reshape((-1,N)).oper(axis=1))
请注意,len(a)
必须能被 N
整除。