为什么在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)
在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)