Как получить одномерные срезы столбцов из 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])
→ Ссылка