초기화 길이가없는 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)]
결과
[[], [], []]