numpy matrix. move all 0's to the end of each row

为君一笑 提交于 2020-01-30 07:56:07

问题


Given a matrix in python numpy which has for some of its rows, leading zeros. I need to shift all zeros to the end of the line. E.g.

0 2 3 4
0 0 1 5
2 3 1 1

should be transformed to

2 3 4 0
1 5 0 0
2 3 1 1

Is there any nice way to do this in python numpy?


回答1:


To fix for leading zeros rows -

def fix_leading_zeros(a):
    mask = a!=0
    flipped_mask = mask[:,::-1]
    a[flipped_mask] = a[mask]
    a[~flipped_mask] = 0
    return a

To push all zeros rows to the back -

def push_all_zeros_back(a):
    # Based on http://stackoverflow.com/a/42859463/3293881
    valid_mask = a!=0
    flipped_mask = valid_mask.sum(1,keepdims=1) > np.arange(a.shape[1]-1,-1,-1)
    flipped_mask = flipped_mask[:,::-1]
    a[flipped_mask] = a[valid_mask]
    a[~flipped_mask] = 0
    return a

Sample runs -

In [220]: a
Out[220]: 
array([[0, 2, 3, 4],
       [0, 0, 1, 5],
       [2, 3, 1, 1]])

In [221]: fix_leading_zero_rows(a)
Out[221]: 
array([[2, 3, 4, 0],
       [1, 5, 0, 0],
       [2, 3, 1, 1]])

In [266]: a
Out[266]: 
array([[0, 2, 3, 4, 0],
       [0, 0, 1, 5, 6],
       [2, 3, 0, 1, 0]])

In [267]: push_all_zeros_back(a)
Out[267]: 
array([[2, 3, 4, 0, 0],
       [1, 5, 6, 0, 0],
       [2, 3, 1, 0, 0]])



回答2:


leading zeros, simple loop

ar = np.array([[0, 2, 3, 4],
       [0, 0, 1, 5],
       [2, 3, 1, 1]])    

for i in range(ar.shape[0]):
    for j in range(ar.shape[1]): # prevent infinite loop if row all zero
        if ar[i,0] == 0:
            ar[i]=np.roll(ar[i], -1)
ar
Out[31]: 
array([[2, 3, 4, 0],
       [1, 5, 0, 0],
       [2, 3, 1, 1]])


来源:https://stackoverflow.com/questions/43010969/numpy-matrix-move-all-0s-to-the-end-of-each-row

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!