我有一个问题需要解答:如何在不丢失数据的情况下将整个浮点数数组转换为整数。
Hunse的回答对我几乎有用,但显然我不能使用就地技巧,因为我需要能够撤销操作:
if np.all(np.mod(x, 1) == 0):
x = x.astype(int)
接下来,我想到了以下选项,这个选项在许多情况下可能更快:
x_int = x.astype(int)
if np.all((x - x_int) == 0):
x = x_int
原因在于模运算比减法慢。然而,现在我们提前将其转换为整数 - 相对而言,我不知道这个操作有多快。但是如果
大多数的数组都是整数(在我的情况下是这样),后者几乎肯定更快。
另一个好处是,您可以使用类似
np.isclose
的东西替换subraction以在一定容差范围内检查(当然,在这里应该小心,因为截断不是适当的舍入!)。
x_int = x.astype(int)
if np.all(np.isclose(x, x_int, 0.0001)):
x = x_int
编辑:如果适用于您的用例,则更慢但可能值得的是,也可以单独转换整数。
x_int = x.astype(int)
safe_conversion = (x - x_int) == 0
if np.all(safe_conversion):
x = x_int.tolist()
else:
x = x.tolist()
if np.any(safe_conversion):
for i in range(len(x)):
if safe_conversion[i]:
x[i] = int(x[i])
作为一个例子,这很重要:这对我很有用,因为我有稀疏数据(即大多数都是零),我将其转换为JSON一次,并在服务器上重复使用。对于浮点数,
ujson
将它们转换为
[ ...,0.0,0.0,0.0,... ]
,对于整数,则结果为
[...,0,0,0,...]
,从而可以节省字符串中字面量数量的一半以上。这样可以减少服务器端(较短的字符串)和客户端(较短的字符串,假定 JSON 解析速度稍快)的开销。