Субдискретизация количества записей в списке (без интерполяции)

У меня есть список Python со многими записями, которые я должен субдискретизировать использование также:

  • Максимальное количество строк. Например, ограничивая список записей 1234 года в 1 000.
  • Пропорция исходных строк. Например, входя в список 1/3 его исходная длина.

(Я должен смочь сделать оба пути, но только один используется за один раз).

Я полагаю, что для максимального количества строк могу просто вычислить необходимую пропорцию и передача что к пропорциональному downsizer:

def downsample_to_max(self, rows, max_rows):
        return downsample_to_proportion(rows, max_rows / float(len(rows)))

... таким образом, мне действительно только нужна одна функция субдискретизации. Какие-либо подсказки?

Править: Список содержит объекты, не числовые значения, таким образом, я не должен интерполировать. Отбрасывание объектов прекрасно.

РЕШЕНИЕ:

def downsample_to_proportion(self, rows, proportion):

    counter = 0.0
    last_counter = None
    results = []

    for row in rows:

        counter += proportion

        if int(counter) != last_counter:
            results.append(row)
            last_counter = int(counter)

    return results

Спасибо.

7
задан Dave 10 June 2010 в 08:40
поделиться

2 ответа

Сохраняйте счетчик, который вы увеличиваете на второе значение. Каждый раз выравнивайте его и получайте значение по этому индексу.

0
ответ дан 7 December 2019 в 03:11
поделиться

Вы можете использовать islice из itertools :

from itertools import islice

def downsample_to_proportion(rows, proportion=1):
    return list(islice(rows, 0, len(rows), int(1/proportion)))

Использование:

x = range(1,10)
print downsample_to_proportion(x, 0.3)
# [1, 4, 7]
6
ответ дан 7 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: