假设一个简单的1维numpy数组:
>>> x = np.array([1,3,5,0,3,2])
现在假设我想执行操作1.0/x
。我可以用numpy做到这一点:
>>> 1.0/x
array([ 1. , 0.33333333, 0.2 , inf, 0.33333333,
0.5 ])
这里的问题是原始元素值0的无穷大(inf
)结果,因为1.0/0
似乎返回无穷大而不是未定义的行为。
而不是无限,我想提供我自己的自定义值,其中这些除以0场景出现。虽然我知道这可以使用循环来完成,但我想知道这种操作是否有任何惯用语法。
有一个相关的问题here,但它只处理如果有的话:(执行此操作)else :(什么也不做)场景,而我的问题是如果有的话:(做这个)其他:(做那个)场景。
答案 0 :(得分:3)
您可以随时修补它:
a = 1.0/x
inf_ind = np.isinf(a)
a[inf_ind] = your_value
或
a[inf_ind] = f(x[inf_ind])
其优点是不会妨碍优化的numpy方法。
答案 1 :(得分:2)
在前一个答案的基础上,您还可以设置浮点回调模式,以检测何时需要应用inf变换。
但是,我找不到在每个浮点错误上调用的回调。
另见: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html
import numpy
class IsDivideError(object):
def __init__(self):
self.hasDivideError=False
def callback(self, x,y):
self.hasDivideError=True
ide=IsDivideError()
numpy.seterr(divide='call')
numpy.seterrcall(lambda x,y: ide.callback(x,y) )
x = numpy.array([1,3,5,0,3,2])
val=1.0/x
if(ide.hasDivideError):
val[numpy.isinf(val)]=5