我有使用不正确的数据类型存储的数据,并且很难将基础数据重新解释为正确的值。数据点实际上是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()
函数,并且在正确的情况下使用了它(这意味着数据已经损坏),还是没有?你知道吗
原来是我自己解决的。我对数据的基本假设和预期是错误的,这就是为什么这么难。过滤掉一个特定参数的数据后,我发现numpy
view
函数确实正确地重新解释了底层字节,因为我知道的事实值很难限制为+-0.2
,整数数据介于950355002
和1045220557
之间,重新解释为:这个较大的数字在重新解释时是
0.2
,这正是我的硬上限。较小的数字实际上是0
,而不是预期的-0.2
。 因此,我确信我的数据被错误地存储为int32而不是float32,但是在这个过程中,负数(float)数据由于某种原因丢失了,并且很可能被存储为默认的-2,147,483,648
值。你知道吗相关问题 更多 >
编程相关推荐