沿轴按一次应用功能n项

时间:2016-12-14 15:45:47

标签: python numpy multidimensional-array

我正在寻找一种在轴上沿时间应用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, ...],
            ...], ...])

3 个答案:

答案 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]])