2013-08-27 25 views
2

我有一個數組,並且想要更改某些元素(如果它們是否定的)(可以是任何布爾條件),但是我也想知道我的代碼是否做到了這一點。python數組條件更改元素檢查numpy

目前我有

Mat = #some source 
Check = Mat < 0 
Check_flag = Check.sum() 

if check_flag != 0: 
    Mat[Check] = 0 #reset those elements 
    logger = logger + '\n This Mat needed to be fixed' #or some over logging method 

這可能是最好的方法,但它在某種程度上感覺太「LBYL」是Python的 - 也是我通常處理超過1E6元素的數組 - 然後循環 - 這樣我有點擔心執行檢查兩次的性能影響(一旦'Check'數組被創建時 - 然後當總結所有元素時再次檢查它們中的一個是否爲'真')。

有沒有人知道這樣做的更好(更有效率)的方式?

+0

作爲一個方面說明,變量名應該是python中的小寫字母,並且類名的第一個字母是大寫。如果您大致遵循[PEP8](http://www.python.org/dev/peps/pep-0008/)指示,則其他人更容易閱讀您的代碼。 –

+0

我一般在這個應用程序中使用矩陣(/ numpy數組)的大寫字母 - 但我認爲這是一個很好的做法,使事情與商定的標準保持一致。 @ J.Martinot-Lagarde – CastleH

回答

3

如果你只是想保留的元素>=0,你應該使用np.clip:

np.clip(Mat, 0, np.inf, out=Mat) 

另一種方式來更有效地做到這一點是:

Mat[ Mat<0 ] = 0 

在您要刪除這兩種情況下在if聲明中,如果您必須保留該聲明,則可以使用np.any,如果Check中的任何元素具有True值,則將避免該總和,其將返回True

Check = Mat<0 
if np.any(Check): 
    Mat[Check] = 0 
    ... 
+3

如果你想限制數值,'np.clip'的速度要快很多,特別是如果你做到了。你可以使用'np.inf'作爲上限。 – Daniel

+0

@Ophion謝謝你,我剛剛編輯了答案......'np.inf'更加優雅 –

+0

我認爲'np.any()'看起來像我所需要的,因爲我想做其他事情好''當且僅當'我必須刪除底片。 – CastleH