Python: получить элемент из списка на основе ввода - PullRequest
0 голосов
/ 03 марта 2011

Я ценю, что это может быть невозможно напрямую, поэтому мне было бы интересно, как вы решите эту проблему для общего случая.У меня есть элемент списка, который выглядит следующим образом: [(array,time),(array,time)...] массив представляет собой массив NumPy, который может иметь любые размерности n на m.Это будет выглядеть так: array[[derivatives dimension1],[derivatives dimension 2] ...]

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

По сути, я хочу получить

def f(list, pos1, pos2):
    xs = []
    ys = []
    for i in list:
        ys.append(i pos1)
        xs.append(i pos2)
    return xs, ys

Где i pos1 эквивалентно i[n][m]Реальная проблема в том, что когда 1 на 1, я не могу просто передать целые числа.Любой совет был бы отличным, извините пост немного длинным, я хотел быть ясным.Спасибо

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Если я правильно понимаю ваш вопрос, вы, по сути, хотите выбрать индексы из списка списков и создать новые списки из этого выбора.

Выбор индексов из списка списков довольно прост, особенно если у вас есть фиксированное количество выборов:

parts = [(item[pos1], item[pos2]) for item in list]

Создать новые списки из этих выборов также довольно просто, используя встроенную функцию zip () :

separated = zip(*parts)

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

def f( list, pos1, pos2 ):
    partsgen = ((item[pos1], item[pos2]) for item in list)
    return zip(*partsgen)

Вот как это выглядит в действии:

>>> f( [['ignore', 'a', 1], ['ignore', 'b', 2],['ignore', 'c', 3]], 1, 2 )
[('a', 'b', 'c'), (1, 2, 3)]

Обновление: Перечитав вопрос и комментарии, я понимаю, что это немного упрощено. Тем не менее, общая идея должна работать, когда вы заменяете pos1 и pos2 для соответствующей индексации во вложенном массиве.

0 голосов
/ 03 марта 2011

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

z = np.dstack([ arr for arr, time in lst ])
x, y = z[pos1], z[pos2]

например:

In [42]: a = arange(9).reshape(3,3)
In [43]: z = np.dstack([a, a*2, a*3])
In [44]: z[0,0]
Out[44]: array([0, 0, 0])
In [45]: z[1,1]
Out[45]: array([ 4,  8, 12])
In [46]: z[0,1]
Out[46]: array([1, 2, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...