Python 当值打印到控制台时,NumPy的行为不规则
我有一个非常简单的Python脚本,它使用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))
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
是一种专门创建数组的方法,对于日常使用来说太“高性能”<代码>零,一
,空
更便于用户使用。