2014-10-06 39 views
3

我有一個MxN數組。我想在一行中的元素爲零或更少之後將所有值清零。當0或更低時爲真,則將陣列行的其餘部分清零

例如,2×12陣列

111110011111 
112321341411 

應該變成

111110000000 
112321341411 

謝謝!

+1

請提供您已經嘗試過的東西的例子。你在用'numpy'數組嗎? – dursk 2014-10-06 00:48:37

回答

5

它可能不是最有效的方法,但我已經使用np.cumsum這些類型的東西。

>>> import numpy as np 

>>> dat = np.array([[1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1], 
        [1, 1, 2, 3, 2, 1, 3, 4, 1, 4, 1, 1], ]) 

>>> dat[np.cumsum(dat <= 0, 1, dtype='bool')] = 0 

>>> print(dat) 
array([[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 2, 3, 2, 1, 3, 4, 1, 4, 1, 1]]) 

@Jaime剛指出,np.logical_or.accumulate(dat <= 0, axis=1),可能比np.cumsum更好。

+0

本來我忘了你可以在cumsum中指定dtype。我更新了包含這個的答案。這可能是一種相當有效的方法。 – farenorth 2014-10-06 01:39:28

+1

不錯的使用布爾索引+1。雖然結果相同,但我認爲將布爾掩碼計算爲'np.logical_or.accumulate(dat <= 0,axis = 1)'更合適一些。 – Jaime 2014-10-06 16:32:13

0

可能是你或其他人需要替代解決方案,而不使用numpy。

>>> dat = ['111110011111','112321341411','000000000000', '123456789120'] 
>>> def zero(dat): 
    result = [] 
    for row in dat: 
     pos = row.find('0') 
     if pos > 0: 
      result.append(row[0:pos] + ('0' * (len(row) - pos))) 
     else: 
      result.append(row) 
    return result 

>>> res = zero(dat) 
>>> res 
['111110000000', '112321341411', '000000000000', '123456789120'] 
>>> dat 
['111110011111', '112321341411', '000000000000', '123456789120'] 
相關問題