2017-03-24 8 views
2

python numpyの行列に、行の一部に先行するゼロがあるとします。私はすべてのゼロを行末までシフトする必要があります。 など。numpy matrix。すべての0を各行の末尾に移動してください。

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の中でこれを行うに任意の良い方法はありますに変換する必要がありますか?

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

をバックにすべてゼロの行をプッシュする - - 先行ゼロの行に定める

+1

あなたの質問タイトルはすべてゼロを指しますが、質問自体は先行ゼロに集中しています。何があれば、非先行ゼロに何が起こるべきか? – DSM

答えて

3

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

が完璧です。ありがとう!! – Souli

0

先行ゼロ、単純なループ

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]]) 
関連する問題