Python 重置为0的多维Numpy数组的累积和

Python 重置为0的多维Numpy数组的累积和,python,arrays,python-3.x,numpy,multidimensional-array,Python,Arrays,Python 3.x,Numpy,Multidimensional Array,我有一个多维NumPy数组(16x212),我想计算212列中每一列的累积和-但是,如果中间有一个0,计算应该在0重新开始。 e、 g.数组([0,1,-1,1,0,-1,1,0,0,1,0,-1,0,0,1,-1],…) 我观看了下面的视频,其中您将0和1的数组累积在一起,但是如果存在负数,该方法将不再有效 有人能帮我吗?用最新的2D填充0是基于 这里的方法是沿着轴取累积的和,然后从后面的任何列中减去累积到最后一个零的和 import numpy as np def fill_zeros_w

我有一个多维NumPy数组(16x212),我想计算212列中每一列的累积和-但是,如果中间有一个0,计算应该在0重新开始。

e、 g.
数组([0,1,-1,1,0,-1,1,0,0,1,0,-1,0,0,1,-1],…)

我观看了下面的视频,其中您将0和1的数组累积在一起,但是如果存在负数,该方法将不再有效


有人能帮我吗?

用最新的2D填充0
是基于

这里的方法是沿着轴取累积的和,然后从后面的任何列中减去累积到最后一个零的和

import numpy as np

def fill_zeros_with_last2d(adj, arr ):
    row, col = np.indices( adj.shape )
    col[(adj == 0) & (arr != 0) ] = 0
    col = np.maximum.accumulate(col, axis = 1 )
    # Find the last column with a value

    return adj[row, col]

def cum_reset_2d( arr ):
    accum = arr.cumsum( axis = 1 )
    adj = accum * ( arr == 0 )
    return accum - fill_zeros_with_last2d( adj, arr )
在小型阵列上进行测试

np.random.seed( 1235 )

arr = np.random.randint( -1, 2, size = ( 5, 10 ))
arr
""" 
array([[ 1,  1,  1,  0, -1, -1, -1,  1,  1, -1],
       [ 1,  1, -1,  1,  1,  1, -1,  0, -1,  1],
       [ 0, -1,  1,  0,  0, -1,  1,  1,  0, -1],
       [ 1,  0, -1,  0, -1,  1,  0,  0,  1,  1],
       [-1,  0,  0, -1, -1,  1,  1, -1,  1, -1]])
"""

cum_reset_2d( arr )
""" 
array([[ 1,  2,  3,  0, -1, -2, -3, -2, -1, -2],
       [ 1,  2,  1,  2,  3,  4,  3,  0, -1,  0],
       [ 0, -1,  0,  0,  0, -1,  0,  1,  0, -1],
       [ 1,  0, -1,  0, -1,  0,  0,  0,  1,  2],
       [-1,  0,  0, -1, -2, -1,  0, -1,  0, -1]])
"""

注意我很难让它正常工作,所以需要在使用前进行测试。原始版本对arr[3]不起作用,但它们现在看起来都正常了。可能还存在一些问题。我的
adj
值为零,必须保留,但被覆盖。

以下是视频链接: