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相关问题的一个答案是根据分母是否为零来操作输出。

假设arrayAarrayB已经初始化,但是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的情况下,这个操作会做一些事情。