Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python a/b,但如果b==0,则返回0_Python_Numpy_Nan - Fatal编程技术网

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
vs
isnan
)。

只计算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
方法即使给定标量也会返回一个数组。@hpaulj
divide
实际上也可以很好地处理标量。是否将注释提升为答案?
a/b
如果任一参数为
nan
,则已返回
nan
;剩下要做的唯一一件事就是显式地测试
b==0
,或者捕获
a/b
b==0
时引发的
ZeroDivisionError
。类似
np.divide
的Ufunc。获取
where
参数(应该与
out
参数一起使用)。处理标量可能需要一个单独的路径,因为大多数
numpy
方法即使给定标量也会返回一个数组。@hpaulj
divide
实际上也可以很好地处理标量。“您想将评论升级为答案吗?”Maroun编辑。@nico读到最后。”要支持标量值…“@Maroun edited@nico read To end.”为了支持标量值…,提供矢量化函数主要是为了方便,而不是为了性能。该实现本质上是一个for循环。看,OP并没有提到性能。这是一个简单的文档化解决方案。我同意,如果绩效是一个问题,这并不理想,但这是一个有效的答案,它是有效的。我认为,鉴于其他简单的解决办法,应该阻止这种做法。未来的读者应该注意并相应地选择。矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个for循环。看,OP并没有提到性能。这是一个简单的文档化解决方案。我同意,如果绩效是一个问题,这并不理想,但这是一个有效的答案,它是有效的。我认为,鉴于其他简单的解决办法,应该阻止这种做法。未来的读者应该意识到这一点,并做出相应的选择。