为什么在Python中设置二维数组的一行为np.nan时得到-9223372036854775808?

In Python, why did I get -9223372036854775808 when I set one row of a 2D array as np.nan?

在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?

供大家参考,我是运行这些代码在python3.7.10环境下由mamba在Ubuntu16.04.7 LTS(GNU/Linux4.15.0 -132-泛型 x86_64).

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

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

您用整数初始化了数组。整数没有可能的“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)