numpy ndarray未初始化的值很有趣

时间:2013-12-04 11:30:00

标签: python numpy initialization

当我创建一个numpy ndarray时,

c = np.ndarray((4, 5))

我明白了:

c = array([[  6.58119589e-295,               nan,   2.10077583e-312,
      1.08646184e-311,   2.84381388e-308],
   [  1.93933443e-309,   1.20154015e-306,   2.90571629e-298,
     -7.52450413e-266,   3.00029506e-309],
   [  1.75738822e+159,   1.75738821e+159,   2.17292369e-310,
      8.73989988e+245,   1.77863364e+248],
   [  8.65447358e+251,   6.21822202e+175,   2.63920065e-314,
      6.60553537e-295,   6.06307776e-295]])

这对我来说非常有趣,因为所有值都是超大正值或接近于零,有时我可以在那里使用NaN。

背后的机制是什么?

它是否与sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)以某种方式相关?

愿意看到你的意见。

更新

我看到它在内存空间中是垃圾,但是什么决定了它们被解释为这些数字?或者说,python如何表示浮点数?

UPDATE ON UPDATE

我看到浮点数是如何工作的,但为什么这些指数是特定的模式呢?

2 个答案:

答案 0 :(得分:1)

Numpy根据类型(默认为np.float)为数组分配所需的内存。如果没有初始化,您看到的结果是在已分配的内存中转换垃圾。并非所有可能的字节组合都可以转换为float,因此NaN,即Not a Number

更新

当您询问浮点表示时,请阅读wikiIEEE 754 standard

默认情况下,

np.float64 bit

>>> np.finfo(np.float)
finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)

在64b操作系统上,您可以拥有[float128] :( http://en.wikipedia.org/wiki/Quadruple_precision_floating-point_format

>>> np.finfo(np.float128)
finfo(resolution=1e-18, min=-1.18973149536e+4932, max=1.18973149536e+4932, dtype=float128)

答案 1 :(得分:0)

根据documentation,如果您在没有ndarray参数的情况下调用buffer,则其填充的值是随机的。他们建议您使用arrayzerosempty来创建新数组,而不是低级ndarray