【问题标题】:Python nan with complex arrays具有复杂数组的 Python nan
【发布时间】:2019-06-30 13:25:45
【问题描述】:

在 Python 中将 nan 插入复杂的 numpy 数组会产生一些(对我而言)意想不到的行为:

a = np.array([5+6*1j])
print a
array([5.+6.j])

a[0] = np.nan
print a
array([nan+0.j])

我希望 Python 编写 nan+nanj. 用于分析,这通常可能无关紧要,因为任何具有实部和/或虚部的复数的 np.isnan 都是 True。但是,我不知道这种行为,并且在绘制数组的实部和虚部时,它给我的印象是我有关于虚部的信息(但没有)。一种解决方法是写a[0] = np.nan + np.nan*1j。有人可以向我解释这种行为的原因吗?

【问题讨论】:

  • 相关链接:NaN 与复数的令人惊讶的行为 #12919 (github.com/numpy/numpy/issues/12919)
  • 我完全同意下面的两个答案,但我认为零虚部是一种不良的副作用,特别是因为正如上面链接中所建议的那样,Python 应该会引发某种警告。

标签: python numpy nan complex-numbers


【解决方案1】:

这可能与 nan 的 numpy 表示有关:

NumPy 使用 IEEE 标准的二进制浮点数进行算术运算 (IEEE 754)。这意味着 Not a Number 不等于 无穷大。

基本上np.nanfloat。通过设置x[0] = np.nan,您将其值设置为“真实”浮点数(但不会更改数组的dtype,这仍然是复杂的),因此虚部保持不变为0j

这也解释了为什么你可以通过np.nan * 0j改变虚部

【讨论】:

    【解决方案2】:

    这里的问题是,当您创建一个具有复杂值的数组时:

    a = np.array([5+6*1j])
    

    您已经创建了一个 dtype complex 数组:

    a.dtype
    # dtype('complex128')
    

    因此,通过添加一个仅包含实部的值,它将被转换为一个复数,因此您将插入一个复数等于 0j 的数字,所以:

    np.complex(np.nan)
    # (nan+0j)
    

    这解释了这种行为:

    a[0] = np.array([np.nan])
    print(a)    
    # [nan+0.j]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多