我有使用不正确数据类型存储的数据,并且无法将基础数据重新解释为正确的值。数据点实际上是float32数字,它们在我无法控制的系统中存储为单个整数(很可能是32位)。我可以访问的是单个整数,我想将它们重新解释为float32,以便在Python 2中获取正确的值。我一直在使用view()
和neworderbytes()
函数,但是得到意想不到的结果。
典型的整数数据是[-2147483648, 875967683, 1005249947, 1216348160]
,它应该返回介于-1和+1之间的浮点数。这些限制并不难,所以浮点数可能略高或略低,但肯定不会高达1e5,这就是我所得到的,见下面的例子:
>>> import numpy as np
>>> si = np.array([-2147483648, 0, 875967683, 1005249947, 1084227584, 1084231267, 1112226524, 1216348160], dtype=np.int32)
>>> si.view(np.float32)
array([ -0.00000000e+00, 0.00000000e+00, 1.69692655e-07,
7.16848439e-03, 5.00000000e+00, 5.00175619e+00,
5.08074799e+01, 2.62144000e+05], dtype=float32)
>>> si.view(np.float32).newbyteorder()
array([ 1.79366203e-43, 0.00000000e+00, -1.80211731e+02,
-3.80362399e-22, 5.74868682e-41, 2.63098489e+21,
-2.09748370e+17, 4.60186416e-41], dtype=float32)
因此,您会发现重新解释的数据并不符合我的期望。此外,整数分布的一些特点引起了我的兴趣,并让我相信也许我在我身边做了一切,但基础数据在存储过程中已经被破坏了。
以下是我所拥有的:
Total number of integers : 321,767
Number of integers = -2,147,483,648 : 91,989
Number of integers = 0 : 163,356
Number of integers > 0 : 66,422
因此,有大部分数据完全等于-2,147,483,648,这是唯一的负数。大约一半正好是0,这是完全正常和正常的,其余的在875,967,683和1,216,348,160之间变化有点奇怪,请参阅(http://i.imgur.com/jJVr1t6.png)的图,其中我对数据进行了排序绘制与指数和直方图。我期望直方图中的正态分布,但显然不是。
所以,我的基本问题归结为:我是否正确使用了view()
函数并且处于正确的情况(这意味着数据已损坏),或者我没有?
答案 0 :(得分:0)
嗯,事实证明我自己解决了这个问题。我对数据的基本假设和期望是错误的,这就是为什么它如此困难。过滤掉一个特定参数的数据,我发现numpy view
函数确实正确地重新解释了底层字节,因为我知道的事实值很难限制为+-0.2
,而整数数据是950355002
和1045220557
之间的重新解释变为:
>>> np.array([950355002, 1045220557], dtype=np.int32).view(np.float32)
array([ 7.88052130e-05, 2.00000003e-01], dtype=float32)
重新诠释时,较大的数字是0.2
,这正是我的上限。较小的数字实际上是0
,而不是预期的-0.2
。
因此,我确信我的数据被错误地存储为int32而不是float32,但在此过程中,负(浮动)数据由于某种原因已经丢失,并且很可能被存储为默认的-2,147,483,648
值。