Используйте простой метод подсчета для определенных критериев - PullRequest
0 голосов
/ 24 августа 2018

У меня есть набор данных, как

x y
1 0.34
2 0.3432
3 0.32
4 0.35
5 0.323
6 0.3623
7 0.345
8 0.32
9 0.31
10 0.378
11 0.34
12 0.33
13 0.31
14 0.33
15 0.34

Для этого набора данных я хочу выполнить задачу, которая будет проходить через мой набор данных и будет подсчитывать количество вхождений выше среза, если длина вхождения превышает M.

Отсечка и M будут системными аргументами.

Так что, если отсечение равно 0,32, а М равно 1, оно распечатает список как

[2, 4, 3, 2]

Логика: первые два значения во втором столбце больше 0,32, а длина больше, чем M = 1, следовательно, распечатано 2 и 4,3,2 и т. Д.

Мне нужна помощь, чтобы написать аргумент так, чтобы, если x> cutoff и длина сломанного>> M, он выводил длину сломанных кадров (так же, как указано выше). Любая помощь?

Структура должна выглядеть следующим образом (я не уверен, как разместить аргумент вместо XXX)

def get_input(filename):
    with open(filename) as f:
        next(f) # skip the first line
        input_list = []
        for line in f:
            input_list.append(float(line.split()[1]))

    return input_list


def countwanted(input_list, wantbroken, cutoff,M):

    def whichwanted(x):
        if(wantbroken): return x > cutoff
        else: return x < cutoff

XXX I think here I need to add the criteria for M but not sure how?

filename=sys.argv[1]
wantbroken=(sys.argv[2]=='b' or sys.argv[2]=='B')
cutoff=float(sys.argv[3])
M=int(sys.argv[4])

input_list = get_input(filename)

broken,lifebroken=countwanted(input_list,True,cutoff,M)
#closed,lifeclosed=countwanted(input_list,False,cutoff,M)
print(lifebroken)
#print(lifeclosed)

Или, может быть, есть более простой способ написать это.

1 Ответ

0 голосов
/ 24 августа 2018

Вы в порядке, используя numpy, который значительно облегчает жизнь.

Прежде всего, давайте посмотрим на загрузчик файлов. np.loadtxt может сделать то же самое в одной строке.

y = np.loadtxt(filename, skiprows=1, usecols=1)

Теперь, чтобы создать маску, значения которой составляют ваши пороговые значения:

b = (y > cutoff)  # I think you can figure out how to switch the sense of the test

Остальное легко и основано на этом вопросе :

b = np.r_[0, b, 0]       # pad the ends
d = np.diff(b)           # find changes in state
start, = np.where(d > 0) # convert switch up to start indices
end, = np.where(d < 0)   # convert switch down to end indices
len = end - start        # get the lengths

Теперь вы можете применить M к len:

result = len[len >= M]

Если вы хотите работать со списками, itertools.groupby также предлагает хорошее решение:

grouper = it.groupby(y, key=lambda x: x > cutoff)
result = [x for x in (len(list(group)) for key, group in grouper if key) if x >= M]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...