我有两个长度相同的列表a
和b
。我想计算它们的比例之和:
c = np.sum(a/b)
当除以零时,如何在求和系数中得到零(0)值?
编辑:这里有几个我为我的案例测试的答案,但仍然会引发错误。可能我错过了一些东西。包含零元素的aray是counts
:
try:
cnterr = (counts/np.mean(counts))*(((cnterr/counts)**2 + (meanerr/np.mean(counts))**2 ))**1/2
except ZeroDivisionError:
cnterr = (counts/np.mean(counts))*(((meanerr/np.mean(counts))**2 ))**1/2
RuntimeWarning: divide by zero encountered in divide
cnterr = (counts/np.mean(counts))*(((cnterr/counts)**2 + (meanerr/np.mean(counts))**2 ))**1/2
还有np.where()
:
cnterr = np.where(counts != 0, ((counts/np.mean(counts))*(((cnterr/counts)**2 + (meanerr/np.mean(counts))**2 ))**1/2), 0)
提出同样的错误。
答案 0 :(得分:3)
除了divide by 0
,
sel = b != 0
c = np.sum(a[sel]/b[sel])
数组为float
,您可能需要使用
sel = np.bitwise_not(np.isclose(b, 0))
更新
如果a
和b
不是np.array
,请在第一个中填写以下代码。
a = np.array(a)
b = np.array(b)
答案 1 :(得分:2)
c = np.where(b != 0, a/b, 0).sum()
请参阅:http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
答案 2 :(得分:0)
这样可行,它会在列表中放置0
,其中除以零:
c = np.sum([x/y if y else 0 for x,y in zip(a,b)])
或者@mskimm答案的变体。注意,首先需要将输入列表转换为numpy数组:
a=np.array(a)
b=np.array(b)
c=np.sum(a[b!=0]/b[b!=0])
答案 3 :(得分:0)
这应该有用。
c = []
for i, j in enumerate(a):
if b[i] != 0:
c += [j/b[i]]
else:
c += [0]
c = sum(c)
答案 4 :(得分:-1)
这也很简单:
c = 0 if 0 in b else sum(a/b)