Python a/b,但如果b==0,则返回0
如果Python a/b,但如果b==0,则返回0,python,numpy,nan,Python,Numpy,Nan,如果b为0,则返回a/b,如果b为0,如果a或b中至少有一个为nan,则返回0,并且适用于标量和数组输入,即 将numpy导入为np def分区(a、b): 输出=a/b #out[b==0]=0类型错误:“float”对象不支持项分配 #out=np.nan到num(out,nan=0.0) 返回 断言div(2,1)=2 断言np.all(div(np.array([2,2]),np.array([1,1])==np.array([2,2])) 断言np.isnan(div(np.nan,n
b
为0
,则返回a/b
,如果b
为0
,如果a
或b
中至少有一个为nan
,则返回0
,并且适用于标量和数组输入,即
将numpy导入为np
def分区(a、b):
输出=a/b
#out[b==0]=0类型错误:“float”对象不支持项分配
#out=np.nan到num(out,nan=0.0)
返回
断言div(2,1)=2
断言np.all(div(np.array([2,2]),np.array([1,1])==np.array([2,2]))
断言np.isnan(div(np.nan,np.nan))
assert div(np.array(0),np.array(0))==0
np.nan\u to_num
几乎可以做到这一点,但我很想控制条件(b==0
vsisnan
)。只计算b不为0的插槽。当然,这是假设(如问题中所述)输入是数组而不是标量
def div(a, b):
out = np.zeros_like(a)
out[b != 0] = a[b != 0] / b[b != 0]
return out
要支持标量值,请将
a,b,=np.array(a),np.array(b)
添加为第一行。仅计算b不为0的插槽。当然,这是假设(如问题中所述)输入是数组而不是标量
def div(a, b):
out = np.zeros_like(a)
out[b != 0] = a[b != 0] / b[b != 0]
return out
要支持标量值,请将
a,b,=np.array(a),np.array(b)
添加为第一行。如何使用np.where
np.where(b==0,0,a/b)
这假设您的输入是numpy数组,但在此之前您可以轻松地处理转换。使用
np怎么样。where
np.where(b==0,0,a/b)
这假设您的输入是numpy数组,但在此之前您可以轻松地处理转换。如果性能不是问题,您可以使用 正如@chepner已经指出的,
nan
案件已经由/
处理。所以您只需要检查b==0
@np.vectorize
def div(a, b):
return 0 if b == 0 else a / b
如果性能不是一个问题,您可以使用 正如@chepner已经指出的,
nan
案件已经由/
处理。所以您只需要检查b==0
@np.vectorize
def div(a, b):
return 0 if b == 0 else a / b
将numpy导入为np
def分区(a、b):
如果(不存在(a,np.ndarray)):
返回a*b和a/b
其他:
a[b==0]=0
b[b==0]=1
返回a/b
断言div(2,1)=2
断言np.all(div(np.array([2,2]),np.array([1,1])==np.array([2,2]))
断言np.isnan(div(np.nan,np.nan))
assert div(np.array(0),np.array(0))==0
将numpy作为np导入
def分区(a、b):
如果(不存在(a,np.ndarray)):
返回a*b和a/b
其他:
a[b==0]=0
b[b==0]=1
返回a/b
断言div(2,1)=2
断言np.all(div(np.array([2,2]),np.array([1,1])==np.array([2,2]))
断言np.isnan(div(np.nan,np.nan))
assert div(np.array(0),np.array(0))==0
a/b
如果任一参数为nan
,则已返回nan
;剩下要做的唯一一件事就是显式地测试b==0
,或者捕获a/b
在b==0
时引发的ZeroDivisionError
。类似np.divide
的Ufunc。获取where
参数(应该与out
参数一起使用)。处理标量可能需要一个单独的路径,因为大多数numpy
方法即使给定标量也会返回一个数组。@hpauljdivide
实际上也可以很好地处理标量。是否将注释提升为答案?a/b
如果任一参数为nan
,则已返回nan
;剩下要做的唯一一件事就是显式地测试b==0
,或者捕获a/b
在b==0
时引发的ZeroDivisionError
。类似np.divide
的Ufunc。获取where
参数(应该与out
参数一起使用)。处理标量可能需要一个单独的路径,因为大多数numpy
方法即使给定标量也会返回一个数组。@hpauljdivide
实际上也可以很好地处理标量。“您想将评论升级为答案吗?”Maroun编辑。@nico读到最后。”要支持标量值…“@Maroun edited@nico read To end.”为了支持标量值…,提供矢量化函数主要是为了方便,而不是为了性能。该实现本质上是一个for循环。看,OP并没有提到性能。这是一个简单的文档化解决方案。我同意,如果绩效是一个问题,这并不理想,但这是一个有效的答案,它是有效的。我认为,鉴于其他简单的解决办法,应该阻止这种做法。未来的读者应该注意并相应地选择。矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个for循环。看,OP并没有提到性能。这是一个简单的文档化解决方案。我同意,如果绩效是一个问题,这并不理想,但这是一个有效的答案,它是有效的。我认为,鉴于其他简单的解决办法,应该阻止这种做法。未来的读者应该意识到这一点,并做出相应的选择。