Mad*_*ist 9 python floating-point numpy
在Python中,可以根据此QA 检查a是否float包含整数值n.is_integer():如何检查浮点值是否为整数.
numpy是否有类似的操作可以应用于数组?允许以下内容的东西:
>>> x = np.array([1.0 2.1 3.0 3.9])
>>> mask = np.is_integer(x)
>>> mask
array([True, False, True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
有可能做类似的事情
>>> mask = (x == np.floor(x))
Run Code Online (Sandbox Code Playgroud)
要么
>>> mask = (x == np.round(x))
Run Code Online (Sandbox Code Playgroud)
但它们涉及调用额外的方法并创建一堆可能被避免的临时数组.
numpy是否有一个矢量化函数,以类似于Python的方式检查浮点数的小数部分float.is_integer?
据我所知,没有这样的函数返回一个布尔数组,指示浮点数是否有小数部分。我能找到的最接近的是np.modf它返回小数部分和整数部分,但这会创建两个浮点数组(至少是暂时的),因此在内存方面可能不是最好的。
如果您对就地工作感到满意,可以尝试以下操作:
>>> np.mod(x, 1, out=x)
>>> mask = (x == 0)
Run Code Online (Sandbox Code Playgroud)
与使用圆形或地板(您必须保留x)相比,这应该可以节省内存,但是当然您会丢失原始的x.
另一种选择是要求在 Numpy 中实现它,或者自己实现它。
我需要这个问题的答案,原因略有不同:检查何时可以将整个浮点数数组转换为整数而不丢失数据。
Hunse 的答案几乎对我有用,但我显然不能使用就地技巧,因为我需要能够撤消操作:
if np.all(np.mod(x, 1) == 0):
x = x.astype(int)
Run Code Online (Sandbox Code Playgroud)
从那里,我想到了以下选项,在许多情况下它可能会更快:
x_int = x.astype(int)
if np.all((x - x_int) == 0):
x = x_int
Run Code Online (Sandbox Code Playgroud)
原因是模运算比减法慢。然而,现在我们预先将其转换为整数 - 相对而言,我不知道该操作有多快。但是,如果大多数数组都是整数(在我的例子中),则后一个版本几乎肯定更快。
另一个好处是,您可以用诸如np.isclose检查一定容差之类的内容来替换减法(当然,这里您应该小心,因为截断不是正确的舍入!)。
x_int = x.astype(int)
if np.all(np.isclose(x, x_int, 0.0001)):
x = x_int
Run Code Online (Sandbox Code Playgroud)
编辑:速度较慢,但根据您的用例,可能值得,如果存在的话,也可以单独转换整数。
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])
Run Code Online (Sandbox Code Playgroud)
作为一个重要的例子:这对我来说很有效,因为我有稀疏数据(这意味着大部分是零),然后我将其转换为 JSON,一次,并稍后在服务器上重用。对于浮点数,ujson将其转换为[ ...,0.0,0.0,0.0,... ],对于结果为 的整数[...,0,0,0,...],最多可节省字符串中一半的字符数。这减少了服务器(较短的字符串)和客户端(较短的字符串,大概是 JSON 解析速度稍快一些)的开销。
| 归档时间: |
|
| 查看次数: |
3621 次 |
| 最近记录: |