Numpy 不断将零变成非常小的数字和"-2147483648"



我有这样的代码

import numpy
a=numpy.pad(numpy.empty([8,8]), 1, constant_values=1)
print(a)

50%的时候我执行它它打印一个正常的数组,50%的时候它打印这个

[[ 1.00000000e+000  1.00000000e+000  1.00000000e+000  1.00000000e+000
1.00000000e+000  1.00000000e+000  1.00000000e+000  1.00000000e+000
1.00000000e+000  1.00000000e+000]
[ 1.00000000e+000  3.25639960e-265  2.03709399e-231 -7.49281680e-111
9.57832017e-299  8.17611616e-093  9.57832017e-299  1.31887592e+066
-2.29724802e+236  1.00000000e+000]
[ 1.00000000e+000  5.11889256e-014 -2.29724802e+236  2.19853714e-004
-2.29724802e+236 -9.20964279e+232  2.37057719e+043  1.48921177e+048
5.29583156e-235  1.00000000e+000]
...

更糟糕的是,当我执行。astype(int)时,它一直这样做

[[          1           1           1           1           1           1
1           1           1           1]
[          1           0           0           0 -2147483648           0
-2147483648           0           0           1]
[          1           0           0 -2147483648           0           0
...

我在两个不同版本的python上测试了它——正常的python 3.11和anaconda 3.9。不幸的是,两者都会导致同样的问题。

问题在于一个空数组是用np.empty初始化的。我不是计算机方面的专家,也不知道它们是如何工作的,但我所知道的是,当一个空数组被初始化时,会分配一块内存来保存新数组的值。这个内存块可以包含先前初始化的值。基本上仍然有一些1和0在内存中,你现在正在打印。当您第一次更改np.pad中的值时,旧内存将被覆盖。我认为你要做的是np.zeros()。比较:<我>

>>> import numpy
>>> a = numpy.empty([2,2])
>>> a
array([[8.88913424e-317, 0.00000000e+000],
[4.01601648e-212, 1.10215522e-317]])
>>> b = numpy.zeros([2,2])
>>> b
array([[0., 0.],
[0., 0.]])
>>> 

您正在使用numpy.empty,这是一个

未初始化(任意)数据数组给定形状、字型和顺序的。对象数组将初始化为None。

见文档。

使用numpy.zerosnumpy.ones来初始化数组

最新更新