当我创建一个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 :
我看到浮点数是如何工作的,但为什么这些指数是特定的模式呢?
答案 0 :(得分:1)
Numpy根据类型(默认为np.float)为数组分配所需的内存。如果没有初始化,您看到的结果是在已分配的内存中转换垃圾。并非所有可能的字节组合都可以转换为float,因此NaN
,即Not a Number
。
更新
当您询问浮点表示时,请阅读wiki或IEEE 754 standard。
默认情况下, np.float
为64 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
,则其填充的值是随机的。他们建议您使用array
,zeros
或empty
来创建新数组,而不是低级ndarray
。