我有一个非常简单的 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]
这对我来说似乎很奇怪,因为这两个语句应彼此无关。
有谁知道为什么我可以获得第二组(不正确的)数字?
答案 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.])