我有一些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])