使用numpy view()函数

时间:2017-06-16 09:39:11

标签: python numpy casting

我有使用不正确数据类型存储的数据,并且无法将基础数据重新解释为正确的值。数据点实际上是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()函数并且处于正确的情况(这意味着数据已损坏),或者我没有?

1 个答案:

答案 0 :(得分:0)

嗯,事实证明我自己解决了这个问题。我对数据的基本假设和期望是错误的,这就是为什么它如此困难。过滤掉一个特定参数的数据,我发现numpy view函数确实正确地重新解释了底层字节,因为我知道的事实值很难限制为+-0.2,而整数数据是9503550021045220557之间的重新解释变为:

>>> 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值。