检查字节字符串是否表示float或int

时间:2020-02-14 11:35:47

标签: python arrays numpy floating-point integer

我有一些byte strings,我不知道它们是整数还是浮点数。

让我们创建一些示例数据:

import numpy as np
arr_int =   np.array([17,    int(1e10),  34567])
arr_float = np.array([17.17, 1e10/np.pi, 34567.8])
arr_int_b = arr_int.tobytes()
# b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x0bT\x02\x00\x00\x00\x07\x87\x00\x00\x00\x00\x00\x00'
arr_float_b = arr_float.tobytes()
# b'\xecQ\xb8\x1e\x85+1@"\xd0\xba}G\xb7\xe7A\xd9\xce\xf7S\xe3\xa5\x0b@'

如果我用numpy.frombuffer(.., dtype=float/int)读取它们并使用错误 dtype,则会得到非常大的值(float-> int)或非常小的值(int-> float )。

arr_float2int = np.frombuffer(arr_float_b, dtype=int)
# array([4625526143032250860, 4748965849765433378, 4674983775839033754])
arr_int2float = np.frombuffer(arr_int_b, dtype=float)
# array([8.39911598e-323, 4.94065646e-314, 1.70783672e-319])

现在,我使用这样的检查来确保获得正确的结果:

arr = np.frombuffer(arr_b, dtype=int)
if np.mean(arr) > 1e12:
    arr = np.frombuffer(arr_b, dtype=float)

这对我来说是有效的,因为我知道我不会拥有大于10000的整数。 我也知道我不会有很小的浮点数。 但是我很好奇是否有更通用(更安全)的方法来检查这一点。

但是我想如果所有的整数和所有的浮点数都被允许了,就不可能分辨出与字节字符串的区别:

np.frombuffer(np.array([1e-320]).tobytes(), dtype=int)
# array([2024])
np.frombuffer(np.array([int(46e17)]).tobytes(), dtype=float)
# array([0.35129566])

0 个答案:

没有答案