在Python中,当我将2D数组的一行设置为np.nan时,为什么会得到9223372036854775808?

2024-05-13 06:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,如果我定义一个2D数组,并将第二行设置为np.nan,那么第二行将变成all-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

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


Tags: 代码gnu定义ubuntulinuxnp数组nan
3条回答

你用整数初始化了你的数组。整数没有可能的“nan”值,将使用最小值。一个快速修复方法是将数组初始化为np。浮点值允许为“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)

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)

相关问题 更多 >