在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])
我不这么认为。我的做法会是
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]
isclose
。我不确定在这里是否有必要,但因为这是一种好的做法,所以已经点赞了。 - Daniel F将每个元素与它本身比较,得到一个整数形式的掩码。
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])
def remove_ints(arr):
return arr[~(arr == arr.astype(int))]
res = remove_ints(A)
array([ 0.01 , 2.001, 2.002])
除此之外,您不应该使用内置类(如input
)作为变量名。
我一直使用 np.equal
和 np.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']
for
循环以提高效率。 - Joe Iddon我不知道是否有内置函数可以实现这个功能,但是你可以使用以下方法过滤那些浮点数:
filter(lambda x: int(str(x).split('.')[1]) != 0, input)
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_.loc
方法获取值。 - Oli我之前有一个类似的问题: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)]