Как эффективно выбрать i-й элемент из 10000 списков Python и эффективно превратить их в список? - PullRequest
0 голосов
/ 27 июня 2018

Я работаю над алгоритмом Монте-Карло. По сути, с учетом времени каждая итерация создает список из 50 элементов, охватывающих 50 лет моделирования. Я добавляю их так, чтобы у меня был список, содержащий 10 000 элементов, каждый из которых представляет собой список из 50 номеров.

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

В качестве простого примера, если бы у меня было 5 прогонов данных за 3 года, у меня мог бы быть список, который выглядит так:

[[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

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

[[1, 1.1, 2.1], [2, 2.2, 2.6], [3, 3.3, 2.7], [4, 4.4, 2.8], [5, 5.5, 2.9]]

Очевидно, что я мог бы грубо форсировать это с помощью двойной петли, но с 500 000 точек данных я ищу что-то более эффективное и Pythonic.

Достаточно ли у кого-нибудь знаний о внутренностях (или пакетах), чтобы это произошло быстро и эффективно?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы можете zip списки:

x = [[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

y = zip(*x) #Unpacking elements of x before zipping

print(list(y))
>>>[(1, 1.1, 2.5), (2, 2.2, 2.6), (3, 3.3, 2.7), (4, 4.4, 2.8), (5, 5.5, 2.9)]
0 голосов
/ 27 июня 2018

Списки являются гибкими элементами; в результате они медленные. Поскольку у вас есть среда с фиксированной шириной, используйте расширенную структуру. Для начала должен помочь массив NumPy 2D. Вам не нужно навязывать ему другую ориентацию: просто используйте предоставленные векторные выражения и заставьте NumPy выполнить необходимые векторизации (при условии, что ваш процессор их поддерживает).

0 голосов
/ 27 июня 2018

Вы можете использовать zip или numpy.transpose (возможно, быстрее):

d = [[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

zip(*d) # returns a generator in Python3, use list on top of it if needed

import numpy as np
np.transpose(d) # returns a np.array, which will behave more or less the same as a Python list
# or simply something like 
arr = np.array(d)
arr[:,i] # returns the i-th values in each row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...