我需要这个问题的答案,原因稍有不同:检查何时可以在不丢失数据的情况下将整个浮点数数组转换为整数。在
Hunse的回答几乎对我有效,只是我显然不能使用就地技巧,因为我需要能够撤消操作:if np.all(np.mod(x, 1) == 0):
x = x.astype(int)
从那里,我想到了以下选项,在许多情况下,可能更快:
^{pr2}$
原因是模运算比减法慢。不过,现在我们先把整数转换成整数-相对而言,我不知道这个操作有多快。但是如果大多数数组都是整数(在我的例子中是这样),那么后一个版本几乎肯定更快。在
另一个好处是,您可以用^{}之类的东西来替换减法,以便在某个公差范围内进行检查(当然,在这里您应该小心,因为截断不是正确的舍入!)。在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 we can convert the whole array to integers, do that
if np.all(safe_conversion):
x = x_int.tolist()
else:
x = x.tolist()
# if there are _some_ integers, convert them
if np.any(safe_conversion):
for i in range(len(x)):
if safe_conversion[i]:
x[i] = int(x[i])
举个例子说明这一点:这对我来说是可行的,因为我有稀疏的数据(通常是零),然后将其转换为JSON,然后在服务器上重用。对于float,ujson将其转换为[ ...,0.0,0.0,0.0,... ],对于结果为[...,0,0,0,...]的整数,最多可节省字符串中一半的字符数。这减少了服务器(较短的字符串)和客户端(较短的字符串,大概更快的JSON解析)的开销。在