我定义了一个我想要用于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
答案 0 :(得分:1)
0.0
不是一个numpy标量,它是一个Python float
。给它一个真正的numpy标量:numpy.float_(0.)
(或你喜欢的浮动类型),它将按预期工作。
请注意,numpy.float_
,numpy.float16
,numpy.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])