过滤 numpy 浮点数组中的整数



是否有任何内置函数可以丢弃整数并仅保留浮点数numpy.

import numpy as np
input = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
desired_ouput = some_function(input)
# Expected ouput
# desired_output = np.array([0.01, 2.001, 2.002])

掩码,每个元素是否等于整数。

arr = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
out = arr[arr != arr.astype(int)]
#np.array([0.01, 2.001, 2.002])

我不这么认为。我的方法是

import numpy as np
a = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
mask = np.isclose(a, a.astype(int))
print(a[~mask])
#[ 0.01   2.001  2.002]

我知道没有内置函数。但您可以自己创建一个:

import numpy as np
A = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
def remove_ints(arr):
return arr[~(arr == arr.astype(int))]
res = remove_ints(A)
array([ 0.01 ,  2.001,  2.002])

除此之外,您不应使用内置类(如input(作为变量名。

我一直np.equalnp.mod一起使用:

>>> A[~np.equal(np.mod(A, 1), 0)]
array([0.01 , 2.001, 2.002])

如果你不需要太多的数据(短列表(,也许不需要numpy

>>> i = [0.0, 0.01, 1.0, 2.0, 2.001, 2.002]
>>> a=[j for j in i if not j.is_integer()]
>>> a
['0.01', '2.001', '2.002']

否则见乔·伊登回答

我不知道有任何内置功能,但您可以使用以下方法过滤这些浮点数:

filter(lambda x: int(str(x).split('.')[1]) != 0, input)

这里的lambda表达式检查小数位是否为零,我将其解释为整数。

不久前我有一个类似的问题: Numpy:检查浮点数组是否包含整数。我目前知道的掩盖分数的最简单方法是

mask = ((input % 1) != 0)

然后,您可以直接使用

output = input[mask]

令我困扰的是,没有内置函数可以快速确定浮点数的整数,因此我编写了一个快速 ufunc,为 numpy 提供了float.is_integer功能。如果你有兴趣,你可以从github下载并编译:

from is_integer_ufunc import is_integer
output = input[~is_integer(input)]

我会看看 numpy 社区是否要考虑在核心库中添加类似的东西。这个问题似乎经常出现,足以证明它的合理性。

最新更新