对 NumPy 数组中的连续值切片求和
Sum slices of consecutive values in a NumPy array
假设我有一个包含 10 个值的 numpy 数组 a
。这里只是一个示例情况,尽管我想对长度为 100 的数组重复相同的操作。
a = np.array([1,2,3,4,5,6,7,8,9,10])
我想将前 5 个值和后 5 个值相加,依此类推,并将它们存储在一个新的空列表中,比如 b
。
所以 b
将包含 b = [15,40]
.
我该怎么做?
试试这个列表理解:
b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
它一次从列表中取出 5 个切片,将它们相加并构建一个列表。也适用于长度不是 5 的倍数的列表。
(xrange
在 python3+ 中应该是 range
)
你可以使用
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]))
一种方法是使用 add
ufunc 及其 reduceat
方法:
>>> np.add.reduceat(a, [0,5])
array([15, 40])
这会将切片 a[0:5]
和 a[5:]
以及 returns 相加为一个新数组。
如果你想要一个 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])
这是(还有)另一个解决方案:
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
),因此高效且快速。
在您的特定情况下,计算 5 个连续元素的总和:
a = np.array([1,2,3,4,5,6,7,8,9,10])
print(a.reshape((-1,5)).sum(axis=1))
一般来说,对N[=25执行numpy数组操作oper(例如mean
或max
) =]连续元素:
print(a.reshape((-1,N)).oper(axis=1))
注意 len(a)
必须能被 N
整除。
假设我有一个包含 10 个值的 numpy 数组 a
。这里只是一个示例情况,尽管我想对长度为 100 的数组重复相同的操作。
a = np.array([1,2,3,4,5,6,7,8,9,10])
我想将前 5 个值和后 5 个值相加,依此类推,并将它们存储在一个新的空列表中,比如 b
。
所以 b
将包含 b = [15,40]
.
我该怎么做?
试试这个列表理解:
b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
它一次从列表中取出 5 个切片,将它们相加并构建一个列表。也适用于长度不是 5 的倍数的列表。
(xrange
在 python3+ 中应该是 range
)
你可以使用
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]))
一种方法是使用 add
ufunc 及其 reduceat
方法:
>>> np.add.reduceat(a, [0,5])
array([15, 40])
这会将切片 a[0:5]
和 a[5:]
以及 returns 相加为一个新数组。
如果你想要一个 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])
这是(还有)另一个解决方案:
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
),因此高效且快速。
在您的特定情况下,计算 5 个连续元素的总和:
a = np.array([1,2,3,4,5,6,7,8,9,10])
print(a.reshape((-1,5)).sum(axis=1))
一般来说,对N[=25执行numpy数组操作oper(例如mean
或max
) =]连续元素:
print(a.reshape((-1,N)).oper(axis=1))
注意 len(a)
必须能被 N
整除。