다차원 배열에서 열을 어떻게 추출합니까?


답변:


227
>>> import numpy as np
>>> A = np.array([[1,2,3,4],[5,6,7,8]])

>>> A
array([[1, 2, 3, 4],
    [5, 6, 7, 8]])

>>> A[:,2] # returns the third columm
array([3, 7])

"numpy.arange"및 "reshape"도 참조하여 메모리를 할당하십시오

예 : (매트릭스 (3x4)의 형태로 배열 할당)

nrows = 3
ncols = 4
my_array = numpy.arange(nrows*ncols, dtype='double')
my_array = my_array.reshape(nrows, ncols)

8
[:, 2]이 기능이 슬라이싱에 대한 공식 문헌에는없는 것 같습니까?
니콘

쉼표는 무엇을 의미합니까?
Phil

3
@ 필 [row, col]. 쉼표가 구분됩니다.
AsheKetchum

11
이 답변은 어떻게 많은 투표를 할 수 있습니까? 영업 이익은 그것이 NumPy와 배열입니다 말한 적
숫자 sziraqui

3
추출 2 열 : A [:, [1,3]] 예 : 추출 두 번째 및 네 번째 열
sadalsuud

177

NumPy 배열을 사용하고 있습니까? 파이썬에는 배열 모듈이 있지만 다차원 배열을 지원하지 않습니다. 일반적인 파이썬리스트도 1 차원입니다.

그러나 다음과 같은 간단한 2 차원 목록이있는 경우 :

A = [[1,2,3,4],
     [5,6,7,8]]

다음과 같이 열을 추출 할 수 있습니다.

def column(matrix, i):
    return [row[i] for row in matrix]

두 번째 열 추출 (인덱스 1) :

>>> column(A, 1)
[2, 6]

또는 간단하게 :

>>> [row[1] for row in A]
[2, 6]

80

당신이 같은 배열을 가지고 있다면

a = [[1, 2], [2, 3], [3, 4]]

그런 다음 첫 번째 열을 다음과 같이 추출하십시오.

[row[0] for row in a]

결과는 다음과 같습니다.

[1, 2, 3]

38

확인 해봐!

a = [[1, 2], [2, 3], [3, 4]]
a2 = zip(*a)
a2[0]

그것은 zip이 작업을 수행하는 것이 더 깔끔하지만 인수로 단일 배열을 필요로한다는 것을 제외하고는 위와 동일합니다. * a 구문은 다차원 배열을 단일 배열 인수로 압축 해제합니다


7
위에 무엇입니까? 답이 항상 같은 방식으로 정렬되는 것은 아닙니다.
Muhd

2
이것은 깨끗하지만 전체 매트릭스를 전치하기 때문에 성능이 문제가되는 경우 가장 효율적이지 않을 수 있습니다.
IceArdor

6
참고로, 이것은 파이썬 2에서 작동하지만 파이썬 3에서는 생성기 객체를 얻습니다.
Rishabh Agrahari

어쨌든 Py3 에서이 지퍼를 수행합니까?
CtrlAltF2

2
@WarpDriveEnterprises yup, 생성기 객체를 목록으로 변환 한 다음 아래 첨자를 수행해야합니다. 예 :a2 = zip(*a); a2 = list(a2); a2[0]
Rishabh Agrahari

14
def get_col(arr, col):
    return map(lambda x : x[col], arr)

a = [[1,2,3,4], [5,6,7,8], [9,10,11,12],[13,14,15,16]]

print get_col(a, 3)

파이썬에서 map 함수는 또 다른 방법입니다.


11
>>> 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])

1
이것은 numpy를 사용하고 있습니까?
Foreever

1
arange()numpy 외부의 Python3에서 문서를 찾을 수 없습니다 . 누군가?
Kevin W Matthews


9

약간의 다양성을 위해 목록 이해보다는 맵 축소 스타일 파이썬을 좋아한다면 itemgetter 연산자도 도움이 될 수 있습니다!

# tested in 2.4
from operator import itemgetter
def column(matrix,i):
    f = itemgetter(i)
    return map(f,matrix)

M = [range(x,x+5) for x in range(10)]
assert column(M,1) == range(1,11)

1
대용량 데이터에 대한 itertools.imap를 사용
파블 Polewicz에게

itemgetter 접근법은 내 유스 케이스의 목록 이해 접근법보다 약 50 배 빠릅니다. Python 2.7.2, 유스 케이스는 수백 개의 행과 열이있는 행렬에서 많은 반복이었습니다.
joelpt

7

이것을 사용할 수도 있습니다 :

values = np.array([[1,2,3],[4,5,6]])
values[...,0] # first column
#[1,4]

참고 : 내장 배열에서는 작동하지 않으며 정렬되지 않습니다 (예 : np.array ([[1,2,3], [4,5,6,7]]))


6

아래 배열과 같은 배열에서 열을 추출하고 싶다고 생각합니다.

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

이제 세 번째 열을 형식으로 얻으려면

D=array[[3],
[7],
[11]]

그런 다음 먼저 배열을 행렬로 만들어야합니다

B=np.asmatrix(A)
C=B[:,2]
D=asarray(C)

이제 Excel에서와 마찬가지로 요소 별 계산을 수행 할 수 있습니다.


1
이것이 많은 도움이되었지만 대답은 훨씬 짧을 수 있다고 생각합니다. 1. A = np.array ([[1,2,3,4], [5,6,7,8], [9,10, 11,12]]) 2. A [:, 1] >> 배열 ([2, 6, 10])
Ufos

6

n X m행렬 ( n행과 m열)이 5 행과 4 열 이라고 가정 해 봅시다.

matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]]

파이썬에서 열을 추출하려면 다음과 같이 목록 이해를 사용할 수 있습니다

[ [row[i] for row in matrix] for in range(4) ]

행렬의 열 수에 따라 4를 바꿀 수 있습니다. 결과는

[ [1,5,9,13,17],[2,10,14,18],[3,7,11,15,19],[4,8,12,16,20] ]


이것이 완전히 새로운 목록을 생성합니까?
Kevin W Matthews

5
array = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

col1 = [val[1] for val in array]
col2 = [val[2] for val in array]
col3 = [val[3] for val in array]
col4 = [val[4] for val in array]
print(col1)
print(col2)
print(col3)
print(col4)

Output:
[1, 5, 9, 13]
[2, 6, 10, 14]
[3, 7, 11, 15]
[4, 8, 12, 16]

4

행렬을 사용하는 또 다른 방법

>>> 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])

3

파이썬 (numpy 아님)에 2 차원 배열이있는 경우 모든 열을 추출 할 수 있습니다.

data = [
['a', 1, 2], 
['b', 3, 4], 
['c', 5, 6]
]

columns = list(zip(*data))

print("column[0] = {}".format(columns[0]))
print("column[1] = {}".format(columns[1]))
print("column[2] = {}".format(columns[2]))

이 코드를 실행하면

>>> print("column[0] = {}".format(columns[0]))
column[0] = ('a', 'b', 'c')

>>> print("column[1] = {}".format(columns[1]))
column[1] = (1, 3, 5)

>>> print("column[2] = {}".format(columns[2]))
column[2] = (2, 4, 6)

물론, 당신은 인덱스에 의해 하나의 열을 추출 할 수 있습니다 (예를 들어 columns[0])


2

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)

2

늦게 '비트'...

성능 문제와 데이터가 직사각형 모양 인 경우 한 차원으로 저장하고 정기적 인 슬라이싱을 통해 열에 액세스 할 수도 있습니다.

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]

이 방법을 확인했는데 열 검색 비용이 중첩 for 루프보다 훨씬 저렴합니다. 그러나 행렬이 큰 경우 2D 행렬을 1d로 줄이는 것이 비용이 많이 듭니다 (예 : 1000 * 1000).
Zhongjun '

2

하나 이상의 열을 가져 오려면 slice를 사용하십시오.

 a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
    print(a[:, [1, 2]])
[[2 3]
[5 6]
[8 9]]

2

다음 힌트를 선호합니다. matrix_acolumn_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]

1

transpose ()를 사용하면 행을 얻는 것처럼 쉽게 열을 얻을 수 있습니다.

matrix=np.array(originalMatrix).transpose()
print matrix[NumberOfColum]

0

행렬에서 새 목록으로의 모든 열 :

N = len(matrix) 
column_list = [ [matrix[row][column] for row in range(N)] for column in range(N) ]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.