Как вы извлекаете столбец из многомерного массива? - PullRequest
193 голосов
/ 24 мая 2009

Кто-нибудь знает, как извлечь столбец из многомерного массива в Python?

Ответы [ 17 ]

5 голосов
/ 02 мая 2018
>>> x = arange(20).reshape(4,5)
>>> x array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]])

если вы хотите второй столбец, вы можете использовать

>>> x[:, 1]
array([ 1,  6, 11, 16])
3 голосов
/ 25 октября 2013

Еще один способ использования матриц

>>> from numpy import matrix
>>> a = [ [1,2,3],[4,5,6],[7,8,9] ]
>>> matrix(a).transpose()[1].getA()[0]
array([2, 5, 8])
>>> matrix(a).transpose()[0].getA()[0]
array([1, 4, 7])
2 голосов
/ 28 марта 2018

Я предпочитаю следующую подсказку: с матрицей с именем matrix_a и использованием column_number, например:

import numpy as np
matrix_a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
column_number=2

# you can get the row from transposed matrix - it will be a column:
col=matrix_a.transpose()[column_number]
2 голосов
/ 03 сентября 2013

Ну, немного "поздно" ...

В случае, если производительность имеет значение, а ваши данные имеют прямоугольную форму, вы также можете хранить их в одном измерении и получать доступ к столбцам с помощью регулярного среза, например. ...

A = [[1,2,3,4],[5,6,7,8]]     #< assume this 4x2-matrix
B = reduce( operator.add, A ) #< get it one-dimensional

def column1d( matrix, dimX, colIdx ):
  return matrix[colIdx::dimX]

def row1d( matrix, dimX, rowIdx ):
  return matrix[rowIdx:rowIdx+dimX] 

>>> column1d( B, 4, 1 )
[2, 6]
>>> row1d( B, 4, 1 )
[2, 3, 4, 5]

Отличная вещь - это действительно быстро. Однако , отрицательные индексы здесь не работают! Таким образом, вы не можете получить доступ к последнему столбцу или строке по индексу -1.

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

def column1d( matrix, dimX, colIdx ):
  return matrix[colIdx % dimX::dimX]

def row1d( matrix, dimX, dimY, rowIdx ):
  rowIdx = (rowIdx % dimY) * dimX
  return matrix[rowIdx:rowIdx+dimX]
1 голос
/ 31 августа 2013

Несмотря на использование zip(*iterable) для транспонирования вложенного списка, вы также можете использовать следующее, если вложенные списки имеют разную длину:

map(None, *[(1,2,3,), (4,5,), (6,)])

Результат:

[(1, 4, 6), (2, 5, None), (3, None, None)]

Первый столбец таков:

map(None, *[(1,2,3,), (4,5,), (6,)])[0]
#>(1, 4, 6)
0 голосов
/ 29 января 2018

Если вы хотите получить более одного столбца, просто используйте слайс:

 a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
    print(a[:, [1, 2]])
[[2 3]
[5 6]
[8 9]]
0 голосов
/ 28 апреля 2014

Все столбцы из матрицы в новый список:

N = len(matrix) 
column_list = [ [matrix[row][column] for row in range(N)] for column in range(N) ]
...