2012-04-21 71 views
2

我正在嘗試使用numpy.select來有條件地給數組賦值。然而,使用select需要對所有可能的任務,而不是僅僅的相關任務,這可能會導致DIV/0錯誤,例如計算:用numpy避免div/0錯誤

import numpy as np 
def testfunc(z): 
    conditionlist = [z < 0, z == 0, z > 0] 
    choicelist = [1/z, 0, 1 + z] 
    return np.select(conditionlist, choicelist) 

if __name__ == "__main__": 

    print testfunc(np.array([0])) 

該代碼將失敗,DIV/0錯誤,雖然1/Z其中z = 0實際上不需要分配給返回的數組。

如何在不碰到div/0錯誤的情況下有條件地將值賦給numpy數組?循環是唯一的選擇嗎?

回答

4
np.select([z < 0, z == 0, z > 0], [1/(z + (z == 0)), 0, 1 + z]) 

z == 0給出了一組布爾值。將此添加到z會給出一個沒有零元素的數組,它等於z,用於np.select將使用的索引。

+0

巧妙的把戲。你碰巧知道這種方法或循環是否更有效?一個循環將避免大量未使用的計算... – elhefe 2012-04-21 19:24:28

+0

@elhefe:你應該確定(我是懶惰的),但我的直覺是,循環會慢得多。 – 2012-04-21 19:29:51

1

使用numpy.seterr可以將被零除的行爲從提升改爲別的。