使用numpy view()函数重新解释错误存储的数据时出现问题

2024-04-29 13:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有使用不正确的数据类型存储的数据,并且很难将基础数据重新解释为正确的值。数据点实际上是32个浮点数,在我无法控制的系统中存储为单个整数(很可能是32位)。我可以访问的是单个整数,我想将它们重新解释为float32,以便在python2中获得正确的值。我一直在使用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

所以,有相当一部分数据正好等于-2147483648,唯一的负数。大约有一半正好是0,这是非常好和正常的,其余的在875967683和1216348160之间变化,有点奇怪,请参阅(http://i.imgur.com/jJVr1t6.png)中的绘图,其中我对数据进行了排序,并绘制了vs索引和直方图。我以为直方图是正态分布,但显然不是。你知道吗

所以,我的基本问题可以归结为:我是否正确地使用了view()函数,并且在正确的情况下使用了它(这意味着数据已经损坏),还是没有?你知道吗


Tags: of数据integers函数viewnumbernp整数
1条回答
网友
1楼 · 发布于 2024-04-29 13:22:13

原来是我自己解决的。我对数据的基本假设和预期是错误的,这就是为什么这么难。过滤掉一个特定参数的数据后,我发现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,但是在这个过程中,负数(float)数据由于某种原因丢失了,并且很可能被存储为默认的-2,147,483,648值。你知道吗

相关问题 更多 >