numpy 如何通过除以零返回0

z9smfwbn  于 2023-08-05  发布在  其他
关注(0)|答案(9)|浏览(119)

我试图在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()似乎不会在出错时返回值。有没有人对我如何在设置自己的除以零错误处理时从numpy中获得最佳效果有任何其他建议?

soat7uwm

soat7uwm1#

在numpy v1.7+中,您可以利用ufuncs的“where”选项。您可以在一行中完成任务,而不必处理errstate上下文管理器。

>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)
>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)

# If you don't pass `out` the indices where (b == 0) will be uninitialized!
>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

字符串
在这种情况下,它在B不等于零的任何地方进行除法计算。当B等于0时,它保持不变,无论你最初在'out'参数中给它什么值。

vu8f3i0k

vu8f3i0k2#

基于@Franck Dernoncourt的答案,修复了-1/0和我在标量上的错误:

def div0( a, b, fill=np.nan ):
    """ a / b, divide by 0 -> `fill`
        div0( [-1, 0, 1], 0, fill=np.nan) -> [nan nan nan]
        div0( 1, 0, fill=np.inf ) -> inf
    """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
    if np.isscalar( c ):
        return c if np.isfinite( c ) \
            else fill
    else:
        c[ ~ np.isfinite( c )] = fill
        return c

字符串

mzsu5hc0

mzsu5hc03#

以其他答案为基础,并在以下方面进行改进:

代码:

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]

9fkzdhlc

9fkzdhlc4#

已弃用(PYTHON 2溶液):

一行程序(抛出警告)

np.nan_to_num(array1 / array2)

字符串

b4lqfgs4

b4lqfgs45#

试着分两步做。先分裂,再替换。

with numpy.errstate(divide='ignore'):
    result = numerator / denominator
    result[denominator == 0] = 0

字符串
numpy.errstate行是可选的,它只是防止numpy告诉你除以零的“错误”,因为你已经打算这样做了,并处理了这种情况。

3zwtqj6y

3zwtqj6y6#

你也可以基于inf进行替换,只有当数组dtypes是浮点数时,就像this answer一样:

>>> 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.])

字符串

8iwquhpp

8iwquhpp7#

我在搜索相关问题时发现的一个答案是根据分母是否为零来处理输出。
假设arrayAarrayB已经初始化,但是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的情况,这个操作会做一些事情。

kd3sttzy

kd3sttzy8#

使用try/except来管理任何类型的numpy RuntimeWarnings的解决方案:

with np.errstate(all='raise'):
    try:
        array3 = array1/array2
    except:
        array3 = array1 # Give whatever default value you like

字符串

iszxjhcz

iszxjhcz9#

另一个值得一提的解决方案:

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> b_inv = np.array([1/i if i!=0 else 0 for i in b])
>>> a*b_inv
array([0., 2., 1.])

字符串

相关问题