2017-02-16 44 views
0

Я пытаюсь создать последовательность целых чисел, которая повторяет элементы в списке несколько раз, добавляя к ним постоянное смещение после каждого повтора.Генерировать повторяющуюся последовательность целых чисел при добавлении смещения после каждого повторения

У меня есть рамка данных pandas со многими столбцами, которые являются повторяющимися блоками информации о тех же N особ. Например, столбцы могут быть [age1, age2, age3, ... ageN, height1, height2, height3, ... heightN, ...], и я хочу, чтобы столбцы были связаны с людьми 1 и 4 (например). Я хочу генерировать индексы столбцов для конкретных лиц, чтобы я мог подмножать данные с помощью df.iloc[:, cindices].

Следующий код работает, но это довольно уродливо, и я надеялся на более чистое и четкое решение (более Pythonic).

subjects = [1, 4] 
N = 11; repeats = 3 
columns = np.array([(np.arange(repeats) * N + i) for i in subjects]) 
cindices = columns.T.flatten() 

# Information for individuals 1 & 4 are in these columns: 
>> array([ 1, 4, 12, 15, 23, 26]) 

ответ

2

Вот версия numpythonic вашего решения

(np.array(subjects)[None, :] + N*np.arange(repeats)[:, None]).ravel() 

[None, :] не является строго необходимым, но я оставил его для ясности.

То, что здесь происходит, broadcasting если применить Numpy с поддержкой оператора, такими как + массивов с формами, например (1, 2) и (3, 1) NumPy будет возвращать (3, 2) массив с ' справа "суммируется в ячейках.

ravel сглаживает массив.

+1

Или просто: '(предметы + N * np.arange (повторы) [:, None]). Ravel()'. – Divakar

+0

@ Дивакар Да, я приеду к этому ;-) –

+0

Увы, проголосовать за обоих. Оба очень коротких решения. Merci. –

 Смежные вопросы

  • Нет связанных вопросов^_^