如何处理nan应用于numpy和scalars的函数?

时间:2016-10-21 14:35:35

标签: python arrays numpy

我定义了一个我想要用于numpy数组和scalars的函数。

def inv(x):
    return 1/x

这会在numpy数组中返回inf

A = np.zeros([4,4])
inv(A)
array([[ inf,  inf,  inf,  inf],
       [ inf,  inf,  inf,  inf],
       [ inf,  inf,  inf,  inf],
       [ inf,  inf,  inf,  inf]])

和标量错误

inv(0.0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in inv
ZeroDivisionError: float division by zero

要检测这些零值,我可以将numpy.where用于numpy数组,如果(a == 0)则用于标量。

你知道一种写这个对numpy数组和标量都有好处的方法吗?

谢谢

GB

2 个答案:

答案 0 :(得分:1)

0.0不是一个numpy标量,它是一个Python float。给它一个真正的numpy标量:numpy.float_(0.)(或你喜欢的浮动类型),它将按预期工作。

请注意,numpy.float_numpy.float16numpy.float32等与numpy.float()不同,后者相当于Python float()(如@dawg指出。

type检查两者以揭示问题:

type(0.0)
>>> <class 'float'>
type(numpy.float_(0.0))
>>> <class 'numpy.float64'>

numpy.float == float
>>> True

此处有更多详情:https://docs.scipy.org/doc/numpy-1.10.1/reference/arrays.scalars.html,请注意关键声明:

  

数组标量具有与ndarrays相同的属性和方法

答案 1 :(得分:1)

使用asanyarray转换参数:

>>> def inv(x):
...     return 1 / np.asanyarray(x)
... 
>>> inv(0)
inf
>>> inv([0])
array([ inf])