排除数组中不包含特定小数的元素

时间:2019-06-10 10:37:04

标签: python arrays for-loop while-loop

我有一个数组,其中包含一个小数点后的数字。小数只能是1、2或3(由用户设置,因此不需要算法)。我想创建一个函数,该函数排除数组中不包含所有三个小数的元素。

例如,当考虑以下数组并预期输出时:

a = np.array([1.1, 1.3, 1.2, 2.1, 2.2])
b = np.array([1.3, 1.2, 1.1, 7.3, 7.1, 8.1, 8.2, 8.3])

#desired output
a_usefull = [1.1, 1.3, 1.2]
b_usebull = [1.3, 1.2, 1.1, 8.1, 8.2, 8.3]
排除了 a 中的

元素2.12.2,因为两者均缺少小数点.3。元素7.37.1被排除,因为缺少十进制.2。请注意,原始数组的顺序是导入的,因此例如[1.3, 1.1, 1.2]应该以{{1​​}}

的形式出现


另一个条件是,例如[1.3, 1.1, 1.2]的输出应与所看到的完全相同。因此,例如,它是[1,1,2,1,2,2],不应为[1,1,1,2,2,2]。顺序不应更改。

我当时正在考虑对数组中的所有元素进行铺底,并首先对其进行计数。但是,代码应在函数中给出。有人可以帮忙吗?

[1.1, 1.3, 2.1, 2.2, 1.2, 2.3]

谢谢!

3 个答案:

答案 0 :(得分:1)

简单而简短

a = np.array([1.1, 1.2, 1.3, 2.1, 2.2])

def remove(id):
    useful_elements=np.array([])
    for x in np.unique(a.astype(int)):
         if((x+.1 in a) and (x+.2 in a) and (x+.3 in a)):
             useful_elements=np.append(useful_elements,(x+.1,x+.2,x+.3))

    return useful_elements

答案 1 :(得分:0)

您可以首先从列表中找到数字的所有整数部分,从中找出一个列表,然后检查更大的列表中是否存在包含所有三个小数的列表

def func(li):

    res = []
    int_li = []

    #Create a list for integers in the input list
    for item in li:
        int_item = int(item)
        if int_item not in int_li:
            int_li.append(int_item)

    #Iterate through the list for integers
    for num in int_li:

        #Create list with all 3 decimals
        check_list = [(num + .1*i) for i in range(1, 4)]
        dec_list = []

        #Iterate through the bigger list
        for number in li:

            #Compare the integer part of element with given integer
            if num == int(number):
                dec_list.append(number)

            #If the found decimal list is present in bigger list with 3 decimals
            if sorted(dec_list) == sorted(check_list):
                #Add it to result and move on to next item
                res.extend(dec_list)
                break

    #Return result
    return res

print(func([1.1, 1.2, 1.3, 2.1, 2.2]))
print(func([1.3, 1.2, 1.1, 7.3, 7.1, 8.1, 8.2, 8.3]))

输出将为

[1.1, 1.2, 1.3]
[1.3, 1.2, 1.1, 8.1, 8.2, 8.3]

答案 2 :(得分:0)

这是我的看法:

# your code goes here
import numpy as np
import math

a = np.array([1.1, 1.2, 1.3, 2.1, 2.2])
b = np.array([1.1, 1.2, 1.3, 7.3, 7.1, 8.1, 8.2, 8.3])

def numpy_filter(arr):
    required_decimals = {1, 2, 3}
    lst = arr.tolist()
    numbers = { math.floor(x) for x in lst }
    fmap = { n: { x for x in lst if math.floor(x) == n } for n in numbers }
    toReturn = []
    for n, decs in fmap.items():
        target_set = { n + x * 0.1 for x in required_decimals }
        if decs == target_set:
            toReturn.extend(target_set)
    return np.array(toReturn)

#desired output
print(numpy_filter(a))
print(numpy_filter(b))
a_usefull = [1.1, 1.2, 1.3]
b_usebull = [1.1, 1.2, 1.3, 8.1, 8.2, 8.3]

首先,我提取基础列表以更轻松地对其进行管理

lst = arr.tolist()

然后我提取集合中的所有整数部分以避免重复

numbers = { math.floor(x) for x in lst }

此后,我在地图中划分了原始列表,为每个整数映射了原始列表中包含的元素

fmap = { n: { x for x in lst if math.floor(x) == n } for n in numbers }

此后,我解析了地图的所有元素,以查找列表中的元素与应具有的元素之间的差异。将地图的任何人添加到返回的新列表中。

toReturn = []
for n, decs in fmap.items():
    target_set = { n + x * 0.1 for x in required_decimals }
    if decs == target_set:
        toReturn.extend(target_set)

这里是executable version