NumPy:用0除零返回0
我试图在Python中执行元素明智的鸿沟,但如果遇到零,我需要商为零。
例如:
array1 = np.array([0, 1, 2]) array2 = np.array([0, 1, 1]) array1 / array2 # should be np.array([0, 1, 2]) 我总是可以通过我的数据使用for循环,但要真正利用numpy的优化,我需要divide函数返回0除以零错误,而不是忽略错误。
除非我失去了一些东西,它似乎并不numpy.seterr()可以返回错误的值。 有没有人有任何其他的build议,我怎样才能得到最好的numpy,同时设置我自己的鸿沟零error handling?
build立在@Franck Dernoncourt的答案,固定-1 / 0:
 def div0( a, b ): """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """ with np.errstate(divide='ignore', invalid='ignore'): c = np.true_divide( a, b ) c[ ~ np.isfinite( c )] = 0 # -inf inf NaN return c div0( [-1, 0, 1], 0 ) array([0, 0, 0]) 
build立在其他答案,并改善:
-  通过向numpy.errstate()添加invalid='ignore'来处理0/0
-  引入numpy.nan_to_num()将np.nan转换为0。
码:
 import numpy as np a = np.array([0,0,1,1,2], dtype='float') b = np.array([0,1,0,1,3], dtype='float') with np.errstate(divide='ignore', invalid='ignore'): c = np.true_divide(a,b) c[c == np.inf] = 0 c = np.nan_to_num(c) print('c: {0}'.format(c)) 
输出:
 c: [ 0. 0. 0. 1. 0.66666667] 
在numpy v1.7 +中,你可以利用ufuncs的“where”选项。 你可以在一行中做事情,而不必处理errstate上下文pipe理器。
 >>> a = np.array([-1, 0, 1, 2, 3], dtype=float) >>> b = np.array([ 0, 0, 0, 2, 2], dtype=float) >>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0) >>> print(c) [ 0. 0. 0. 1. 1.5] 
在这种情况下,它在任何地方进行除法计算,其中b不等于零。 当b等于零时,那么它与原来在“out”参数中给出的值无关。
尝试分两步进行。 先划分,然后更换。
 with numpy.errstate(divide='ignore'): result = numerator / denominator result[denominator == 0] = 0 
  numpy.errstate行是可选的,只是防止numpy告诉你关于除以零的“错误”,因为你已经打算这样做,并处理这种情况。 
对于那些喜欢一线球员的人来说,这是一个很好的窍门,而不是他们讨厌的警告:
 np.nan_to_num(array1 / array2) 
 你也可以根据inf来replace,只要数组dtypes是浮点数就可以了。 
 >>> a = np.array([1,2,3], dtype='float') >>> b = np.array([0,1,3], dtype='float') >>> c = a / b >>> c array([ inf, 2., 1.]) >>> c[c == np.inf] = 0 >>> c array([ 0., 2., 1.]) 
我发现search相关问题的一个答案是根据分母是否为零来操作输出。
 假设arrayA和arrayB已经初始化,但是arrayB有一些零。 如果我们想要安全地计算arrayC = arrayA / arrayB我们可以做到以下arrayC = arrayA / arrayB 。 
 在这种情况下,每当在一个单元格中除以零时,我将单元格设置为等于myOwnValue ,在这种情况下,它将为零 
 myOwnValue = 0 arrayC = np.zeros(arrayA.shape()) indNonZeros = np.where(arrayB != 0) indZeros = np.where(arrayB = 0) # division in two steps: first with nonzero cells, and then zero cells arrayC[indNonZeros] = arrayA[indNonZeros] / arrayB[indNonZeros] arrayC[indZeros] = myOwnValue # Look at footnote 
 脚注:回想起来,这行是不必要的,因为arrayC[i]被实例化为零。 但是,如果myOwnValue != 0的情况下,这个操作会做一些事情。