[python] 파이썬에서 2 차원 배열을 정의하는 방법

초기화 길이가없는 2 차원 배열을 다음과 같이 정의하고 싶습니다.

Matrix = [][]

그러나 그것은 작동하지 않습니다 …

아래 코드를 시도했지만 잘못되었습니다.

Matrix = [5][5]

오류:

Traceback ...

IndexError: list index out of range

내 실수는 무엇입니까?



답변

기술적으로 초기화되지 않은 배열을 색인하려고합니다. 항목을 추가하기 전에 먼저 목록으로 외부 목록을 초기화해야합니다. 파이썬은 이것을 “목록 이해력”이라고 부릅니다.

# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)] 

이제 목록에 항목을 추가 할 수 있습니다.

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range... 
Matrix[0][6] = 3 # valid

매트릭스는 “y”주소 주이며, “y 인덱스”는 “x 인덱스”앞에옵니다.

print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing! 

원하는대로 이름을 지정할 수 있지만 내부 및 외부 목록 모두에 “x”를 사용하고 정사각형이 아닌 매트릭스를 원할 경우 인덱싱에 발생할 수있는 혼동을 피하기 위해이 방법을 살펴 봅니다.


답변

행렬을 정말로 원한다면을 사용하는 것이 좋습니다 numpy. 행렬 연산은 numpy대부분 2 차원 배열 유형을 사용합니다. 새로운 배열을 만드는 방법에는 여러 가지가 있습니다. 가장 유용한 zeros기능 중 하나는 모양 매개 변수를 사용하여 지정된 모양의 배열을 반환하며 값이 0으로 초기화 된 함수입니다.

>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

다음은 2 차원 배열과 행렬을 만드는 다른 방법입니다 (압축성을 위해 출력을 제거함).

numpy.arange(25).reshape((5, 5))         # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5))   # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5))    # pass a Python list and reshape
numpy.empty((5, 5))                      # allocate, but don't initialize
numpy.ones((5, 5))                       # initialize with ones

numpy제공하지 않습니다 matrix뿐만 아니라 유형을하지만,이되어 더 이상 권장 에 대한 모든 사용 및 제거 할 수있다 numpy미래입니다.


답변

다음은 목록 목록을 초기화하기위한 짧은 표기법입니다.

matrix = [[0]*5 for i in range(5)]

불행히도 이것을 같은 것으로 단축하는 5*[5*[0]]것은 실제로 작동하지 않습니다. 왜냐하면 동일한 목록의 사본 5 개로 끝나기 때문에 그중 하나를 수정하면 모두 변경됩니다. 예를 들면 다음과 같습니다.

>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]


답변

빈 행렬을 만들려면 올바른 구문은

matrix = [[]]

0으로 채워진 크기 5의 행렬을 생성하려면

matrix = [[0 for i in xrange(5)] for i in xrange(5)]


답변

원하는 것이 일부 요소를 담는 2 차원 컨테이너라면, 대신 사전을 편리하게 사용할 수 있습니다.

Matrix = {}

그럼 당신은 할 수 있습니다 :

Matrix[1,2] = 15
print Matrix[1,2]

이것은 1,2튜플 이기 때문에 작동 하며 사전을 색인화하는 키로 사용하고 있습니다. 결과는 멍청한 희소 행렬과 유사합니다.

osa 및 Josap Valls에 의해 표시된대로 Matrix = collections.defaultdict(lambda:0)누락 된 요소의 기본값이로 설정되도록 사용할 수도 있습니다 0.

Vatsal은이 방법이 아마도 큰 행렬에는 그리 효율적이지 않으며 코드의 성능에 중요하지 않은 부분에만 사용해야한다고 지적합니다.


답변

파이썬에서는리스트리스트를 만들 것입니다. 치수를 미리 선언 할 필요는 없지만 가능합니다. 예를 들면 다음과 같습니다.

matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)

이제 matrix [0] [0] == 2 및 matrix [1] [0] == 3입니다. 목록 이해 구문을 사용할 수도 있습니다. 이 예제에서는 두 번 사용하여 “2 차원 목록”을 작성합니다.

from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]


답변

받아 들인 대답은 좋고 정확하지만 완전히 빈 배열을 만드는 데 사용할 수 있다는 것을 이해하는 데 시간이 걸렸습니다.

l =  [[] for _ in range(3)]

결과

[[], [], []]