【问题标题】:numpy matrix. move all 0's to the end of each rownumpy 矩阵。将所有 0 移到每行的末尾
【发布时间】:2017-08-18 01:39:10
【问题描述】:

在 python numpy 中给定一个矩阵,它的某些行具有前导零。我需要将所有零移到行尾。 例如

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

应该转化为

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

在 python numpy 中有什么好的方法可以做到这一点吗?

【问题讨论】:

  • 您的问题标题指的是全零,但您的问题本身集中在前导零上。非前导零应该发生什么(如果有的话)?

标签: python numpy theano


【解决方案1】:

前导零,简单循环

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

【讨论】:

    【解决方案2】:

    修复前导零行 -

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

    将所有零行推到后面 -

    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
    

    示例运行 -

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

    【讨论】:

    • 完美。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多