Исключить элементы в массиве, которые не содержат определенных десятичных знаков - PullRequest
2 голосов
/ 10 июня 2019

У меня есть массив, который содержит числа с одним десятичным знаком. Десятичное число может быть только 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]

Элемент 2.1 и 2.2 в a исключен, поскольку десятичная дробь .3 отсутствует в обеих. Элемент 7.3 и 7.1 исключен, поскольку отсутствует десятичный знак .2. Обратите внимание, что порядок исходного массива является импортным, поэтому, например, [1.3, 1.1, 1.2] должен выглядеть как [1.3, 1.1, 1.2]


Другое условие состоит в том, что выходные данные, например, [1.1, 1.3, 2.1, 2.2, 1.2, 2.3] должны быть точно такими, как это видно. Так, например, это [1,1,2,1,2,2] не должно быть [1,1,1,2,2,2]. Порядок не должен меняться.

Я думал собрать все элементы в массиве и сначала подсчитать их. Тем не менее, код должен быть дан в функции. Может ли кто-нибудь помочь с циклом время или для этого?

def remove(id):

return useful_elements

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Простой и короткий

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
0 голосов
/ 10 июня 2019

Вот мой дубль:

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

Вот как исполняемая версия

0 голосов
/ 10 июня 2019

Вы можете начать с поиска всех целых частей чисел из списка, составить из них список, а затем проверить, существует ли список, содержащий все три десятичных знака, в большем списке

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...