Как получить одномерные срезы столбцов из 2d-массива (список списков)?
Подскажите, можно ли из списка списков выбрать столбцы командой в 1 строчку?
Конечно можно сделать через for, например:
col0 = [obj[0] for obj in arr]
col1 = [obj[1] for obj in arr]
Но есть ли возможность сделать это как-нибудь через срезы, что-то типа [:;0]?
Опять же, если надо получить несколько столбцов, то как-то не очень красиво писать кучу строк по выборке нескольких столбцов или через append делать.
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Вариант 1: воспользуйтесь zip() для транспонирования матрицы:
l = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
c1, c2, c3 = zip(*l)
результат:
In [87]: print(c1, c2, c3)
(0, 3, 6, 9) (1, 4, 7, 10) (2, 5, 8, 11)
Вариант 2: если хотите через срезы - можно использовать срезы в транспонированной матрице:
m = list(zip(*l))
c1, c2, c3 = m[0], m[1], m[2]
Вариант 3: или же используйте модуль Numpy, где все это и многое другое доступно "из коробки":
import numpy as np
In [98]: a = np.array(l)
In [99]: a
Out[99]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [100]: a[:, 2]
Out[100]: array([ 2, 5, 8, 11])