对于我的unittest,我想检查两个数组是否相同.减少的例子:
a = np.array([1, 2, np.NaN])
b = np.array([1, 2, np.NaN])
if np.all(a==b):
print 'arrays are equal'
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为nan!= nan.什么是最好的方法?
提前致谢.
我已经operator<为某个对象实现了.从逻辑上讲,如果!(a < b)和!(b < a)它的意思a == b.
这是自动推断的吗?==如果我只实施,我可以使用<吗?
我有一个变量x,我想测试x是否设置为NaN.我怎么做?
我的第一直觉可能就是测试它,就像这样:
if (x === NaN) { ...
Run Code Online (Sandbox Code Playgroud)
傻兔子,不,这太容易了.NaN在SQL中就像NULL,它不等于任何东西,甚至本身.
但是看,有一个叫做的函数isNaN()- 也许会这样做!
不,据我所知,isNaN()完全没有价值.
例如,isNaN([""])正确返回false,但isNaN(["."])返回true.你不想知道我是如何了解这个缺陷的.
我该怎么做呢?
我一直在阅读Douglas Crockford的JavaScript:The Good Parts,我遇到了一个对我来说没有意义的奇怪例子:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == undefined // false
false == null // false
null == undefined // true
Run Code Online (Sandbox Code Playgroud)
作者还提到"从不使用==和!=.而是始终使用===和!==".但是,他没有解释为什么表现出上述行为?所以我的问题是,为什么上面的结果是这样的?JavaScript中不考虑传递性吗?
在许多情况下,JavaScript的类型强制相等运算符不可传递.例如,请参阅" JavaScript等同传递性很奇怪".
但是,是否有任何情况下,在==没有对称?也就是说,这里a == b是true和b == a是false?
javascript symmetric equivalence ecma262 comparison-operators
免责声明:不,我没有找到任何明显的答案,与我的预期相反!
在寻找代码示例时.算术平均值,我可以通过谷歌调出的前几个例子似乎被定义为空序列产生的平均值0.0.(例如,这里和这里 ......)
然而,看一下维基百科,算术平均值被定义为空序列会产生0.0 / 0-
A = 1/n ?[i=1 -> n](a[i])
Run Code Online (Sandbox Code Playgroud)
因此,如果我编写一个计算一组浮点值的算术平均值的效用函数,我应该在一般情况下:
0.空序列?(Q)NaN空序列?在我正在处理的一些数据中,我遇到了 类型的数据float,其中填充了“nan”,即float('nan')。
然而,检查它并没有按预期工作:
float('nan') == float('nan')
>> False
Run Code Online (Sandbox Code Playgroud)
您可以使用 检查它math.isnan,但由于我的数据还包含字符串(例如:'nan',但也包含其他用户输入),所以不太方便:
import math
math.isnan(float('nan'))
>> True
math.isnan('nan')
>> TypeError: must be real number, not str
Run Code Online (Sandbox Code Playgroud)
在理想的情况下,我想检查一个值是否在所有可能的 NaN 值的列表中,例如:
import numpy as np
if x in ['nan', np.nan, ... ]:
# Do something
pass
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
我怎样才能仍然使用这种方法,同时检查float('nan')值?以及为什么等于float('nan') == float('nan') False
使用GCC 5.3,以下代码符合 -O3 -fma
float mul_add(float a, float b, float c) {
return a*b + c;
}
Run Code Online (Sandbox Code Playgroud)
生成以下程序集
vfmadd132ss %xmm1, %xmm2, %xmm0
ret
Run Code Online (Sandbox Code Playgroud)
Clang 3.7带-O3 -mfma产品
vmulss %xmm1, %xmm0, %xmm0
vaddss %xmm2, %xmm0, %xmm0
retq
Run Code Online (Sandbox Code Playgroud)
但Clang 3.7与-Ofast -mfmaGCC生成的代码相同-O3 fast.
我很惊讶GCC的确如此,-O3因为从这个答案来看
除非允许使用宽松的浮点模型,否则不允许编译器融合分离的加法和乘法.
这是因为FMA只有一个舍入,而ADD + MUL有两个舍入.因此,编译器将通过融合违反严格的IEEE浮点行为.
但是,从这个链接说
无论FLT_EVAL_METHOD的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度.
所以现在我感到困惑和担忧.
-O3?__STDC_IEC_559__不是一个矛盾吗?由于FMA 可以在软件中进行仿真,因此似乎应该有两个用于FMA的编译器开关:一个用于告诉编译器在计算中使用FMA,一个用于告诉编译器硬件具有FMA.
显然,这可以通过选项进行控制-ffp-contract.对于GCC,默认是-ffp-contract=fast和Clang不一样.其他选项例如 …
当您执行以下操作时,会发生未来警告:
>>> numpy.asarray([1,2,3,None]) == None
Run Code Online (Sandbox Code Playgroud)
目前返回False,但据我所知,将返回包含[False,False,False,True]在Numpy的未来版本中的数组.
正如在numpy讨论列表中所讨论的,解决这个问题的方法是测试a is None.
令我困惑的是,in与列表相比,具有1D数组的关键字的这种行为:
>>> None in [1,2,3,None]
True
>>> None in numpy.asarray([1,2,3,None])
__main__:1: FutureWarning: comparison to 'None' will result in an elementwise
object comparison in the future
False
>>> 1 in numpy.asarray([1,2,3,None])
True
Run Code Online (Sandbox Code Playgroud)
编辑(见评论) - 真的有两个不同的问题:
FutureWarning- 将未来的行为None in numpy.asarray(...)与现在的行为进行比较?in来自于list; 我可以测试我的数组是否包含None而不将其转换为列表或使用for循环? Numpy版本是1.9.1,Python 3.4.1
当我检查它在列表或集合中的存在时,NaN处理得很好.但我不明白怎么做.[更新:不,不是; 如果找到相同的NaN实例,则报告存在; 如果只发现不同的NaN实例,则报告为缺席.
我认为列表中的存在是通过相等来测试的,所以我预计NaN不会被发现,因为NaN!= NaN.
hash(NaN)和hash(0)都是0.字典和集合如何告诉NaN和0分开?
使用in运算符检查任意容器中NaN的存在是否安全?还是依赖于实现?
我的问题是关于Python 3.2.1; 但如果在未来的版本中存在/计划的任何更改,我也想知道.
NaN = float('nan')
print(NaN != NaN) # True
print(NaN == NaN) # False
list_ = (1, 2, NaN)
print(NaN in list_) # True; works fine but how?
set_ = {1, 2, NaN}
print(NaN in set_) # True; hash(NaN) is some fixed integer, so no surprise here
print(hash(0)) # 0
print(hash(NaN)) # 0
set_ = {1, 2, 0}
print(NaN in set_) # False; works fine, but how?
Run Code Online (Sandbox Code Playgroud)
请注意,如果我将一个用户定义的类的实例添加到a list …
nan ×4
python ×4
javascript ×3
numpy ×3
c++ ×2
equivalence ×2
c ×1
clang ×1
containers ×1
ecma262 ×1
equality ×1
fma ×1
gcc ×1
ieee-754 ×1
math ×1
python-3.x ×1
symmetric ×1
transitivity ×1