Есть ли способ удалить аналогичные (числовые) элементы из массива в Python - PullRequest
1 голос
/ 13 марта 2019

У меня есть функция, которая создает массив следующим образом:

[ 14  48  81 111 112 113 114 148 179 213 247 279 311 313 314 344 345 346]

, который соответствует значениям данных, где кривая пересекает ось х.Поскольку данные несовершенны, они генерируют ложные срабатывания, где в моем выходном массиве все элементы расположены очень близко друг к другу, например, [111 112 113 114].Мне нужно удалить ложные срабатывания из этого массива, но при этом сохранить первоначальный положительный результат в том месте, где отображаются ложные срабатывания.В основном мне нужна моя функция для создания и массива, например,

[ 14  48  81 112 148 179 213 247 279 313 345]

, где были удалены ложные срабатывания из несовершенных данных.

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

Вот один из возможных подходов:

arr = [14, 48, 81, 111, 112, 113, 114, 148, 179, 213, 247, 279, 311, 313, 314, 344, 345, 346]

def filter_arr(arr, offset):
    filtered_nums = set()
    for num in sorted(arr):
        # Check if there are any "similar" numbers already found
        if any(num+x in filtered_nums for x in range(-offset, offset+1)):
            continue
        else:
            filtered_nums.add(num)
    return list(sorted(filtered_nums))

Затем вы можете применить фильтрацию с любым смещением, которое, на ваш взгляд, наиболее целесообразно.

filter_arr(arr, offset=5)  
Output:  [14, 48, 81, 111, 148, 179, 213, 247, 279, 311, 344]
0 голосов
/ 13 марта 2019

Я бы сделал это следующим образом:

Концептуально: допустим, что десять из числа - это количество из 10, которое можно вписать в данное число, например, десять из 111 - это 11, десять из 247 - это 24, а десять - это десять.из 250 - это 25 и так далее.Для наших данных, если число с данными десять уже существует, отбросьте его.

Код:

data = [14,48,81,111,112,113,114,148,179,213,247,279,311,313,314,344,345,346]
cleaned = [i for inx,i in enumerate(data) if not i//10 in [j//10 for j in data[:inx]]]
print(cleaned) #[14, 48, 81, 111, 148, 179, 213, 247, 279, 311, 344]

Обратите внимание, что 10 является только примером значения, которое вы можете заменить другим значением - большим значениемозначает, что больше элементов будет потенциально удалено.Имейте в виду, что особенность этого решения заключается в том, что определенные пары значений (для 10, например, 110 и 111) будут обрабатываться как разные и будут оставаться в списке вывода, поэтому вам нужно проверить, не является ли этопроблема в вашем случае использования.

0 голосов
/ 13 марта 2019

Это может сделать

#arr is the array you want, num is the number difference between them

def check(arr, num):
    for r in arr:
        for c in arr:
            if abs(r-c) < num + 1:
                arr.remove(c)
    return arr
yourarray = [14,48  ,81 ,111 ,112 ,113 ,114, 148 ,            179 ,213 ,247 ,279 ,311, 313 ,314 ,344, 345, 346]
print(check(yourarray, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...