2013-01-24 53 views
1

簡明條件語法假設一個簡單的一維數組numpy的:numpy的:對於陣列的劃分

>>> x = np.array([1,3,5,0,3,2]) 

現在假設我要執行的操作1.0/x。我可以用numpy的做到這一點:

>>> 1.0/x 
array([ 1.  , 0.33333333, 0.2  ,   inf, 0.33333333, 
    0.5  ]) 

這裏的問題是無窮大(inf)結果爲原始的元素值0,因爲1.0/0似乎代替不確定的行爲返回無窮大。

而不是無窮大,我想提供我自己的自定義價值在這些除以0場景出現。雖然我知道這可以使用循環來完成,但我想知道這種操作是否有任何類型的慣用語法。

有一個相關的問題here,但它僅與交易如果事情:(這樣做)其他:(什麼都不做)場景,而我的問題是如果事情:(這樣做)其他:(做)方案。

回答

3

您可以隨時修補起來以後:

a = 1.0/x 
inf_ind = np.isinf(a) 
a[inf_ind] = your_value 

a[inf_ind] = f(x[inf_ind]) 

已在的漂亮優化numpy的方法的方式沒有得到的好處。

2

基於上一個答案,您還可以設置浮點回調模式來檢測何時需要應用inf變換。

但是,我無法找到在每個浮點錯誤上調用的回調。

參見: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

import numpy 
class IsDivideError(object): 
    def __init__(self): 
     self.hasDivideError=False 

    def callback(self, x,y): 
     self.hasDivideError=True 

ide=IsDivideError() 
numpy.seterr(divide='call') 
numpy.seterrcall(lambda x,y: ide.callback(x,y)) 
x = numpy.array([1,3,5,0,3,2]) 
val=1.0/x 
if(ide.hasDivideError): 
    val[numpy.isinf(val)]=5