【问题标题】:In Python, why did I get -9223372036854775808 when I set one row of a 2D array as np.nan?在Python中,当我将二维数组的一行设置为np.nan时,为什么会得到-9223372036854775808?
【发布时间】:2021-09-23 03:28:48
【问题描述】:

在 Python 中,如果我定义一个二维数组,并将第二行设置为 np.nan,则第二行将变为全 -9223372036854775808 而不是缺失值。一个例子在这里:

b = np.array(
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
 [0, 3, 4, 4, 6, 6, 6, 5, 4, 5],
 [0, 0, 0, 3, 6, 6, 6, 6, 6, 6],
 [0, 0, 3, 4, 6, 6, 6, 6, 6, 6],
 [0, 1, 2, 4, 4, 4, 4, 4, 4, 4]])

b[1, :] = np.nan
print(b)

[[                   0                    0                    0
                 0                    0                    0
                 0                    0                    0
                 5]
[-9223372036854775808 -9223372036854775808 -9223372036854775808
 -9223372036854775808 -9223372036854775808 -9223372036854775808
 -9223372036854775808 -9223372036854775808 -9223372036854775808
 -9223372036854775808]
[                   0                    0                    0
                 3                    6                    6
                 6                    6                    6
                 6]
[                   0                    0                    3
                 4                    6                    6
                 6                    6                    6
                 6]
[                   0                    1                    2
                 4                    4                    4
                 4                    4                    4
                 4]]

有人知道吗?我应该如何正确地将一行分配给 np.nan?

供您参考,我在 Ubuntu 16.04.7 LTS(GNU/Linux 4.15.0-132-generic x86_64)上由 mamba 创建的 python 3.7.10 环境中运行这些代码。

【问题讨论】:

  • 在我的 Mac Python 3.9.4 (NumPy 1.21.0) 环境中运行您的代码,我得到“ValueError: cannot convert float NaN to integer” for b[1, :] = np.nan...
  • 相关的是,-9223372036854775808 是 64 位有符号整数可以容纳的最小值。

标签: python python-3.x numpy nan


【解决方案1】:

np.nan 是一个特殊的浮点值,不能在整数数组中使用。由于b 是一个整数数组,代码b[1, :] = np.nan 尝试将np.nan 转换为一个整数,这是一个未定义的行为。有关类似问题的讨论,请参阅 this

【讨论】:

    【解决方案2】:

    首先,nan 是一个仅适用于浮点数组的特殊值。

    我尝试在基于 Windows x-64 的 python 3.8(64 位环境)上运行您的代码。

    b = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
                  [0, 3, 4, 4, 6, 6, 6, 5, 4, 5],
                  [0, 0, 0, 3, 6, 6, 6, 6, 6, 6],
                  [0, 0, 3, 4, 6, 6, 6, 6, 6, 6],
                  [0, 1, 2, 4, 4, 4, 4, 4, 4, 4]])
    b[1, :] = np.nan
    print(b)
    

    这就是我得到的

    [[          0           0           0           0           0           0
            0           0           0           5]
     [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648
      -2147483648 -2147483648 -2147483648 -2147483648]
     [          0           0           0           3           6           6
            6           6           6           6]
     [          0           0           3           4           6           6
            6           6           6           6]
     [          0           1           2           4           4           4
            4           4           4           4]]
    

    int 数组的情况下,我得到 int 的下限代替 NaN 并且根据您的环境,您也会得到相同的结果.

    因此,您可以使用 float 数组来代替 int 数组。

    b = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
                  [0, 3, 4, 4, 6, 6, 6, 5, 4, 5],
                  [0, 0, 0, 3, 6, 6, 6, 6, 6, 6],
                  [0, 0, 3, 4, 6, 6, 6, 6, 6, 6],
                  [0, 1, 2, 4, 4, 4, 4, 4, 4, 4]], dtype=float)
    

    【讨论】:

      【解决方案3】:

      你用整数初始化了你的数组。整数没有可能的“nan”值,将求助于最小值。一个快速的解决方法是将你的数组初始化为 np.floats,它们可以是“nan”:

      b = np.array(
      [[0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
       [0, 3, 4, 4, 6, 6, 6, 5, 4, 5],
       [0, 0, 0, 3, 6, 6, 6, 6, 6, 6],
       [0, 0, 3, 4, 6, 6, 6, 6, 6, 6],
       [0, 1, 2, 4, 4, 4, 4, 4, 4, 4]], dtype=np.float)
      
      b[1, :] = np.nan
      print(b)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2011-02-25
        相关资源
        最近更新 更多