我正在寻找一种在轴上沿时间应用n项功能的方法。 E.g。
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8]])
如果我一次在行2个项目中应用sum
:
array([[ 4, 6],
[ 12, 14]])
这是前2行和后2行的sum
。
注意:我正在处理更大的数组,我必须将该函数应用于n项,我可以在运行时决定。
数据沿不同的轴延伸。 E.g。
array([[... [ 1, 2, ...],
[ 3, 4, ...],
[ 5, 6, ...],
[ 7, 8, ...],
...], ...])
答案 0 :(得分:3)
这是减少:
numpy.add.reduceat(a, [0,2])
>>> array([[ 4, 6],
[12, 14]], dtype=int32)
只要“更大”表示“y”轴更长,就可以扩展:
a = numpy.array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10],
[11, 12]])
numpy.add.reduceat(a, [0,2,4])
>>> array([[ 4, 6],
[12, 14],
[20, 22]], dtype=int32)
编辑:实际上,这也适用于“两个维度都更大”:
a = numpy.arange(24).reshape(6,4)
numpy.add.reduceat(a, [0,2,4])
>>> array([[ 4, 6, 8, 10],
[20, 22, 24, 26],
[36, 38, 40, 42]], dtype=int32)
我会根据您的具体情况调整指数。
答案 1 :(得分:2)
将第一个轴重新分成两个轴,使第二个分割轴的长度为n
,以得到一个3D数组,然后沿着该分割轴求和,如下所示 -
a.reshape(a.shape[0]//n,n,a.shape[1]).sum(1)
它应该非常有效,因为重新整形只是创建一个输入数组的视图。
示例运行 -
In [55]: a
Out[55]:
array([[2, 8, 0, 0],
[1, 5, 3, 3],
[6, 1, 4, 7],
[0, 4, 0, 7],
[8, 0, 8, 1],
[8, 3, 3, 8]])
In [56]: n = 2 # Sum every two rows
In [57]: a.reshape(a.shape[0]//n,n,a.shape[1]).sum(1)
Out[57]:
array([[ 3, 13, 3, 3],
[ 6, 5, 4, 14],
[16, 3, 11, 9]])
答案 2 :(得分:1)
这样的事情怎么样?
n = 2
# calculate the cumsum along axis 0 and take one row from every n rows
cumarr = arr.cumsum(axis = 0)[(n-1)::n]
# calculate the difference of the resulting numpy array along axis 0
np.vstack((cumarr[0][None, :], np.diff(cumarr, axis=0)))
# array([[ 4, 6],
# [12, 14]])