相关疑难解决方法(0)

比较含有NaN的numpy数组

对于我的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.什么是最好的方法?

提前致谢.

python numpy

52
推荐指数
7
解决办法
2万
查看次数

我可以使用operator ==如果我只实现了运算符<?

我已经operator<为某个对象实现了.从逻辑上讲,如果!(a < b)!(b < a)它的意思a == b.

这是自动推断的吗?==如果我只实施,我可以使用<吗?

c++ operator-overloading

51
推荐指数
9
解决办法
8983
查看次数

你如何在JavaScript中测试NaN?

我有一个变量x,我想测试x是否设置为NaN.我怎么做?

我的第一直觉可能就是测试它,就像这样:

if (x === NaN) {  ...
Run Code Online (Sandbox Code Playgroud)

傻兔子,不,这太容易了.NaN在SQL中就像NULL,它不等于任何东西,甚至本身.

但是看,有一个叫做的函数isNaN()- 也许会这样做!

不,据我所知,isNaN()完全没有价值.

例如,isNaN([""])正确返回false,但isNaN(["."])返回true.你不想知道我是如何了解这个缺陷的.

我该怎么做呢?

事实证明,我的问题与问题重复,但所选答案是错误的.将正确的答案有20%之多upvotes.

javascript nan

39
推荐指数
2
解决办法
4万
查看次数

JavaScript等同传递性很奇怪

我一直在阅读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 transitivity equivalence comparison-operators

37
推荐指数
2
解决办法
1万
查看次数

JavaScript的双等于(==)总是对称的吗?

在许多情况下,JavaScript的类型强制相等运算符不可传递.例如,请参阅" JavaScript等同传递性很奇怪".

但是,是否有任何情况下,在==没有对称?也就是说,这里a == btrueb == afalse

javascript symmetric equivalence ecma262 comparison-operators

36
推荐指数
3
解决办法
3660
查看次数

空序列的算术平均值是多少?

免责声明:不,我没有找到任何明显的答案,与我的预期相反!

在寻找代码示例时.算术平均值,我可以通过谷歌调出的前几个例子似乎被定义为空序列产生的平均值0.0.(例如,这里这里 ......)

然而,看一下维基百科,算术平均值被定义为空序列会产生0.0 / 0-

 A = 1/n ?[i=1 -> n](a[i])
Run Code Online (Sandbox Code Playgroud)

- 所以,可能一般情况下的NaN.

因此,如果我编写一个计算一组浮点值的算术平均值的效用函数,我应该在一般情况下:

  • 返回0.空序列?
  • 返回(Q)NaN空序列?
  • 在空序列的情况下"抛出异常"?

c++ math floating-point nan

36
推荐指数
3
解决办法
2525
查看次数

如何在Python中检查float('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

python numpy

15
推荐指数
1
解决办法
3万
查看次数

融合乘法加法和默认舍入模式

使用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)

我注意到GCC -O3已经在GCC 4.8中这样做了.

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的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度.

所以现在我感到困惑和担忧.

  1. GCC是否有理由使用FMA -O3
  2. 融合是否违反了严格的IEEE浮点行为?
  3. 如果融合确实违反了IEEE浮点运算,那么GCC的回归__STDC_IEC_559__不是一个矛盾吗?

由于FMA 可以在软件中进行仿真,因此似乎应该有两个用于FMA的编译器开关:一个用于告诉编译器在计算中使用FMA,一个用于告诉编译器硬件具有FMA.


显然,这可以通过选项进行控制-ffp-contract.对于GCC,默认是-ffp-contract=fast和Clang不一样.其他选项例如 …

c gcc clang ieee-754 fma

14
推荐指数
1
解决办法
1347
查看次数

为什么"numpy.asarray(...)中的无"会导致未来的警告

当您执行以下操作时,会发生未来警告:

>>> 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)

编辑(见评论) - 真的有两个不同的问题:

  1. 为什么这会导致FutureWarning- 将未来的行为None in numpy.asarray(...)与现在的行为进行比较?
  2. 为什么行为的差异in来自于list; 我可以测试我的数组是否包含None而不将其转换为列表或使用for循环?

Numpy版本是1.9.1,Python 3.4.1

python numpy nan

13
推荐指数
1
解决办法
6403
查看次数

检查容器中的NaN存在

当我检查它在列表或集合中的存在时,NaN处理得很好.但我不明白怎么做.[更新:不,不是; 如果找到相同的NaN实例,则报告存在; 如果只发现不同的NaN实例,则报告为缺席.

  1. 我认为列表中的存在是通过相等来测试的,所以我预计NaN不会被发现,因为NaN!= NaN.

  2. hash(NaN)和hash(0)都是0.字典和集合如何告诉NaN和0分开?

  3. 使用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 …

python containers equality nan python-3.x

12
推荐指数
1
解决办法
2835
查看次数