Получить индексы для образца списка списков - PullRequest
1 голос
/ 03 марта 2020

У меня есть несколько списков данных в python:

a = [2,45,1,3]
b = [4,6,3,6,7,1,37,48,19]
c = [45,122]
total = [a,b,c]

Я хочу получить n случайные индексы из них:

n = 7
# some code
result = [[1,3], [2,6,8], [0,1]] # or
result = [[0], [0,2,6,8], [0,1]] # or
result = [[0,1], [0,2,3,6,8], []] # or any other

Идея - это происходит случайным образом любые элементы (индексы этих элементов) из любых массивов, но общее их количество должно быть n.

Так что моя идея - генерировать случайные индексы:

n = 7
total_len = sum([len(el) for el in total])
inds = random.sample(range(total_length), n))

Но как тогда получить такие показатели? Я думаю о np.cumsum() и смещении индексов после этого, но не могу найти элегантного решения ...


PS На самом деле мне нужно использовать его для загрузки данных из нескольких файлов csv с помощью skiprow вариант. Поэтому моя идея - получить индексы для каждого файла, и это позволяет мне загружать только необходимые строки из каждого файла. Итак, моя настоящая задача: у меня есть несколько CSV-файлов разной длины, и мне нужно получить n случайных строк из них. Моя идея:

lengths = my_func_to_get_lengths_for_every_csv(paths) # list of lengths
# generate random subsamle of indexes
skip = ...
for ind, fil in enumerate(files):
    pd.read_csv(fil, skiprows=skip[ind])

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете сначала сгладить список, а затем взять свои образцы:

total_flat = [item for sublist in total for item in sublist]
inds = random.sample(total_flat , k=n)
1 голос
/ 03 марта 2020

Это то, что вы имеете в виду?

relative_inds = []
min_bound = 0
for lst in total:
    relative_inds.append([i - min_bound for i in inds if min_bound <= i < min_bound + len(lst)])
    min_bound += len(lst)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...