2016-04-03 3 views
1

У меня есть список, назовите его test, с 3 столбцами, каждый столбец содержит 891 элемент, каждый элемент представляет собой пару поплавков. Я хочу создать матрицу numpy с тремя столбцами, каждая из которых имеет 891 элемент, каждый элемент является первой записью из пары поплавков.Получение правильных элементов из списка в python

У меня есть следующий код:

x = [] 
y = [] 
for i in range(len(test)): 
    for j in range(len(test[0])): 
     y.append(test[i][j][0]) 
    x.append(y) 
    y = [] 

tt = numpy.matrix(x) 

Это работает, но я могу написать это более эффективным и элегантным способом?

EDIT: Пример:

[0.5, 0.5],[0.3, 0.4],[0.1, 0.4] 
[0.7, 0.6],[0.1, 0.4],[0.2, 0.3] 
[0.2, 0.5],[0.6, 0.9],[0.3, 0.2] 
[0.2, 0.5],[0.6, 0.9],[0.4, 0.1] 

Я хочу:

[0.5, 0.3, 0.1] 
[0.7, 0.1, 0.2] 
[0.2, 0.6, 0.3] 
[0.2, 0.6, 0.4] 
+0

@ Dex'ter Спасибо. Является ли codereview нормально даже для небольших фрагментов кода, подобных этому? Я посмотрел на него, и все они кажутся более сложными, чем это. В таком случае, должен ли я просто удалить этот вопрос и отправить его там? – user

+0

Вы можете опубликовать там этот код, несколько тестовых примеров и пример файла. Я уверен, что вы найдете там что-то хорошее. –

+1

Не уверен, что это то, что вы хотите, но вы можете попробовать: 'np.matrix (np.array (test) [..., 0] .squeeze(). T)'. – Divakar

ответ

0

Две особенности Python, чтобы узнать: итерируемых и выражения генератора.

Вы не указали данные примера, поэтому мы не можем подтвердить, что мы видим то же поведение, что и вы. Всегда лучше, чтобы поставил в ваш вопрос minimal, complete, verifiable example для нас.

Даже лучше, если имена более описательный умысла, чем просто x или test.

test = [ 
    [2, 4, 6], 
    [3, 6, 9], 
    [4, 8, 2], 
    ] 
  • Вместо возился с индексом последовательности, предпочитают iterating over the iterables, чтобы получить детали напрямую:
import numpy 

rows = [] 
cells = [] 
for test_row in test: 
    for column in test_row: 
     cells.append(column) 
    rows.append(cells) 
    cells = [] 

tt = numpy.matrix(rows) 
  • Вместо добавления элементов по одному за раз, предпочитают list comprehension, если это помогает читаемости:
import numpy 

rows = [ 
    [column for column in row] 
    for row in test] 

tt = numpy.matrix(rows) 

Иногда (не в этом случае) вам даже не нужен список для всех существующих одновременно; вам просто нужно перебрать элементы, а затем отбросить эту последовательность. Тогда выражение генератора лучше; Посмотрите, что один, когда у вас есть время.

Будьте осторожны, чтобы увидеть их в качестве вариантов улучшения удобочитаемости. Они не всегда подходят, и иногда они могут сделать ваш код слишком плотным и трудночитаемым.

+0

Спасибо за учебник. Я добавил пример, как вы предложили. – user

1
x = np.asarray(test)[:, :, 0] 

Простой как это. Можно утверждать, что это не так эффективно, как память, поскольку вы также сохраняете элементы, которые вас не интересуют, по крайней мере временно; но это все равно бледнеет, к использованию памяти ваших вложенных структур данных python.

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