Efficiently test matrix rows and columns with numpy

前端 未结 2 439
囚心锁ツ
囚心锁ツ 2021-01-24 16:18

I am trying to remove both the row i and column i when both the row i and column i contains all 0s. For example in this case we can see that row 0 is all zeros

2条回答
  •  执念已碎
    2021-01-24 16:45

    Vectorized approach with masking -

    def remove_vectorized(a):
        mask = a==0
        m_row = ~mask.all(1)
        m_col = ~mask.all(0)
        comb_mask = m_row | m_col
        return a[comb_mask][:,comb_mask] #or a[np.ix_(comb_mask, comb_mask)]
    

    Sample runs

    Case #1 :

    In [485]: a
    Out[485]: 
    array([[0, 0, 0, 0, 0],
           [0, 1, 0, 1, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0]])
    
    In [486]: remove_vectorized(a)
    Out[486]: 
    array([[1, 1],
           [0, 0]])
    

    Case #2 :

    In [489]: a
    Out[489]: 
    array([[0, 0, 1, 0, 0, 1],
           [0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 1, 0]])
    
    In [490]: remove_vectorized(a)
    Out[490]: 
    array([[0, 1, 0, 1],
           [0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 1, 1, 0]])
    

提交回复
热议问题