在np.sqrt()或np.arctan()中无法解释的Numpy nan

时间:2014-11-16 01:22:35

标签: python numpy nan

我有两个数据集,data1和data2。我正在获取这些数据集并执行此操作:

Out=np.arctan(np.sqrt(data1/data2))

Out中有三个元素,它们实际上不应该是值nan。我将这些nan元素的索引保存在名为nanind的列表中。所以:

Out[nanind[0]]==nan
Out[nanind[1]]==nan
Out[nanind[2]]==nan

现在这部分让我感到非常困惑。

np.arctan(np.sqrt(data1[nanind[0]]/data2[nanind[0]))
np.arctan(np.sqrt(data1[nanind[1]]/data2[nanind[1]))
np.arctan(np.sqrt(data1[nanind[2]]/data2[nanind[2]))

不要回南。它们按预期返回正浮点数。任何人都可以解释这一点,我真的需要Out来摆脱纳米元素吗?

P.S。我也尝试过以下形式一次完成这一个元素:

for i in range(data1.shape[0]):
    for j in range(data1.shape[1]):
        Out[i,j]=np.arctan(np.sqrt(data1[i,j]/data2[i,j]))

Out仍然具有相同的三个元素。

1 个答案:

答案 0 :(得分:2)

np.sqrt()返回NaN作为否定输入。

>>> np.sqrt([-1,2,3])
array([        nan,  1.41421356,  1.73205081])

在错误的类型上,如np.sqrt('hello'),它会引发TypeError

如果您的应用程序在数学上允许,您可以允许np.sqrt()通过传递复数来将复数传递到下一步。这可以像将0j添加到浮点数一样简单:

>>> x = -1
>>> np.sqrt(x)
nan
>>> np.sqrt(x+0j)
1j

否则,您应该使用np.isnan测试np.sqrt的输出,可能与any结合使用以测试数组,并打印适当的警告或引发异常。

>>> np.isnan(np.sqrt([-1,2,3]))
array([ True, False, False], dtype=bool)

>>> np.isnan(np.sqrt([-1,2,3])).any()
True

step = np.sqrt(inputArray)
if np.isnan(step).any():
    # do something to report the error
    badItems = np.where(np.isnan(step))
    print "bad inputs at :"+str(badItems)
    print "bad input values: "+str(inputArray[np.isnan(step)])
    raise Exception("unexpected nans in sqrt step")

这不是为永久代码编写异常的最佳方法,但可用于调试。要了解有关异常处理的更多信息,请参阅Python Docs, Chapter 8: Errors and Exceptions