我有两个数据集,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
仍然具有相同的三个元素。
答案 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