当值打印到控制台{N'Py}时,NumPy表现不规律

时间:2015-08-21 20:06:04

标签: python numpy

我有一个非常简单的 Python 脚本,它使用numpy

from collections import defaultdict
from functools import partial
import numpy as np

defaultdict(partial(np.ndarray, 10))
boolean = np.array([x % 2 == 0 for x in xrange(10)])
genes = defaultdict(partial(np.ndarray, 10))

print np.array(boolean)
print genes['no-data']

给出输出:

[ True False  True False  True False  True False  True False]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

这似乎按预期工作。但是,如果我只是注释print np.array(boolean)我得到输出:

[  3.10503618e+231   3.10503618e+231   2.22343947e-314   2.22346872e-314
   2.22346870e-314   2.22346875e-314   2.22354680e-314   2.22354683e-314
   0.00000000e+000   0.00000000e+000]

这对我来说似乎很奇怪,因为这两个语句应彼此无关。

有谁知道为什么我可以获得第二组(不正确的)数字?

1 个答案:

答案 0 :(得分:4)

值不正确。您正在创建未初始化的数组。内存的内容是发生在为数组分配的内存中的任何内容。不保证为0。

如果要使用0初始化数组,请使用np.zeros

In [35]: genes = defaultdict(partial(np.zeros, 10))

In [36]: genes['no-data']
Out[36]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

In [37]: genes['foo']
Out[37]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

虽然像@PadraicCunningham在评论中提到的那样,我将摆脱functools的导入并改为使用lambda表达式:

In [38]: genes = defaultdict(lambda: np.zeros(10))

In [39]: genes['no-data']
Out[39]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

In [40]: genes['foo']
Out[40]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])