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

mxg2im7a  于 2023-03-18  发布在  Python
关注(0)|答案(4)|浏览(185)

在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环境。

j2datikz

j2datikz1#

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

6tr1vspr

6tr1vspr2#

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

5jvtdoz23#

首先,nan是一个仅用于浮点数组的特殊值。
我试着运行你的代码在我的python 3.8(64位环境)在Windows x-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,根据您的环境,您也会得到相同的下限。
所以你可以用floatarray来代替intarray。

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

rxztt3cl4#

这个数字等于-2 3,这是64位整数限制的最小值,我没有用python编写代码,但在我看来,您的代码没有将NaN识别为一个值,所以它使用了它可以识别的最小值。

相关问题