在numpy的浮点数数组中过滤整数

29

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])

5
该数组中的所有值都是浮点数。 "浮点数"并不意味着该值不是整数。 - user2357112
7个回答

18

我不这么认为。我的做法会是

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]

3
通常情况下,在比较浮点数时应始终使用isclose。我不确定在这里是否有必要,但因为这是一种好的做法,所以已经点赞了。 - Daniel F
1
盲目遵循所谓的“最佳实践”并不是一个好习惯。根据这些数字的来源,“isclose”可能实际上会对其造成积极的伤害。 - Ruslan

18

将每个元素与它本身比较,得到一个整数形式的掩码。

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])

6

我不知道有任何内置函数可以实现此功能。但是你可以自己创建一个:

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)作为变量名。


6

我一直使用 np.equalnp.mod

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

4

如果您没有太多的数据(短列表),也许不需要使用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']

否则请查看Joe Iddon的答案。

10
Scipy 的理念是尽可能避免使用 for 循环以提高效率。 - Joe Iddon

2

我不知道是否有内置函数可以实现这个功能,但是你可以使用以下方法过滤那些浮点数:

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

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

转换为字符串会丢失精度。例如,2.001 变成了 2.0009999999999999 - Oli
什么?我刚试图复制这个,但[str(x) for x in input]返回:['0.0','0.01','1.0','2.0','2.001','2.002']?但是即使我假设有精度损失,结果也不会改变,因为在int转换后,“001”不会变成0,就像“00099999”一样。 - meissner_
这发生在我的Python中。实际上,这些是Pandas数据帧的索引,因此精度损失意味着我无法通过应用.loc方法获取值。 - Oli
如果你能找到一种复制这种效果的方法,那将非常有趣。 - meissner_

0

我之前有一个类似的问题:Numpy: Check if float array contains whole numbers。目前我所知道最简单的屏蔽小数的方法是

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社区是否愿意考虑将此类功能添加到核心库中。这个问题似乎经常出现,足以证明它的必要性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接