Python 当值打印到控制台时,NumPy的行为不规则

Python 当值打印到控制台时,NumPy的行为不规则,python,numpy,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))

我有一个非常简单的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.]
[  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]
这似乎和预期的一样有效。但是,如果我只是注释掉
print np.array(boolean)
,我会得到以下输出:

[ True False  True False  True False  True False  True False]
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[  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

如果要将数组初始化为0,请使用
np.zero

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.])
虽然,正如@Padraiccningham在评论中所建议的那样,我还是放弃了
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.]) 

这些值没有错误。您正在创建未初始化的数组。内存的内容是为数组分配的内存中发生的任何内容。它不能保证为0

如果要将数组初始化为0,请使用
np.zero

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.])
虽然,正如@Padraiccningham在评论中所建议的那样,我还是放弃了
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.]) 

值可以是数组中的任何内容,如果在python3下运行,每次调用都会看到随机值,我可以使用python2复制该行为,但打印总是会影响输出。那么我如何将值初始化为
0
?我原以为
defaultdict
会这样做,但我猜不会。为什么不干脆
genes=defaultdict(lambda:np.zeros(10))
?值可以是数组中的任何内容,如果在python3下运行,每次调用都会看到随机值,不过我可以使用python2复制行为,打印总是会影响输出。那么如何将值初始化为
0
?我原以为
defaultdict
会这样做,但我猜不会。为什么不干脆
genes=defaultdict(lambda:np.zeros(10))
?嗯……当
genes
用一个不存在的键进行索引时,
defaultdict
不会用默认值初始化一个?你已经设置了
genes
调用
ndarray(10)
。为
ndarray(10)
返回的数组分配的内存未初始化,因此无法保证其内容。
ndarray
是一种专门创建数组的方法,对于日常使用来说太“高性能”<代码>零,
对用户更友好。嗯……默认DICT不会用默认值初始化a?当
基因
使用不存在的键进行索引时,您已将
基因
设置为调用
ndarray(10)
。为
ndarray(10)
返回的数组分配的内存未初始化,因此无法保证其内容。
ndarray
是一种专门创建数组的方法,对于日常使用来说太“高性能”<代码>零,
更便于用户使用。