use*_*243 6 python arrays numpy sum list
假设我有一个a包含10个值的numpy数组.这里只是一个示例情况,尽管我想对长度为100的数组重复相同的操作.
a = np.array([1,2,3,4,5,6,7,8,9,10])
Run Code Online (Sandbox Code Playgroud)
我想总结前5个值,然后是第二个5值,依此类推,并将它们存储在一个新的空列表中b.
所以b会包含b = [15,40].
我该怎么做呢?
Ale*_*ley 10
一种方法是使用addufunc及其reduceat方法:
>>> np.add.reduceat(a, [0,5])
array([15, 40])
Run Code Online (Sandbox Code Playgroud)
这会对切片求和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])
Run Code Online (Sandbox Code Playgroud)
这里(还有)另一个解决方案:
In [3]: a.reshape((2,5)).sum(axis=1)
Out[3]: array([15, 40])
Run Code Online (Sandbox Code Playgroud)
将一维数组重塑为两行,每行5列,然后对各列求和:
In [4]: a.reshape((2,5))
Out[4]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
Run Code Online (Sandbox Code Playgroud)
每行的总和(汇总各列条目)由指定axis=1。重塑不会复制数据(也无需修改原始数据a),因此高效而快速。
尝试这个列表理解:
b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
Run Code Online (Sandbox Code Playgroud)
它每次从列表中取出 5 个切片,将它们相加并构建一个列表。也适用于长度不是 5 倍数的列表。
(xrange应该是rangepython3+)