我有这样的代码
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.zeros
或numpy.ones
来初始化数组