초기화 길이가없는 2 차원 배열을 다음과 같이 정의하고 싶습니다.
Matrix = [][]
그러나 그것은 작동하지 않습니다 ...
아래 코드를 시도했지만 잘못되었습니다.
Matrix = [5][5]
오류:
Traceback ...
IndexError: list index out of range
내 실수는 무엇입니까?
초기화 길이가없는 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"를 사용하고 정사각형이 아닌 매트릭스를 원할 경우 인덱싱에 발생할 수있는 혼동을 피하기 위해이 방법을 살펴 봅니다.
range
, 내부 목록을 직접 작성하는 데 사용할 수 있습니다.[range(5) for x in range(5)]
[0] * w
부분은 좋지만 [[0] * w] * h]
예기치 않은 동작이 발생합니다. 시도 mat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
와 mat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.
행렬을 정말로 원한다면을 사용하는 것이 좋습니다 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
미래입니다.
np.matrix
을 나타내는 데 사용해야한다는 의미는 아닙니다 . numpy에서 행렬을 나타내는 올바른 방법은을 사용하는 것 array
입니다.
array
는 행렬 대신을 출력 합니다. 항상 권장되는 것은 아니지만 matrix
상황에 맞는 합법적 인 이유가 있습니다 .
matrix
? 때문에 @
운영자가 도입되었다,이 게시물이 기록 된 이후 한 적은 이유가있을 것 같습니다.
다음은 목록 목록을 초기화하기위한 짧은 표기법입니다.
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]]
[0]*5
합니까?
[[0]*5 for _ in range(5)]
당신이 사용하지 않는 익명의 루프 카운터
[0]*5
잘 작동 하는 방식 이 혼란 스러웠습니다 . 이제는 왜 [{0}]*8
나쁜 생각 인지 이해 합니다.
빈 행렬을 만들려면 올바른 구문은
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은이 방법이 아마도 큰 행렬에는 그리 효율적이지 않으며 코드의 성능에 중요하지 않은 부분에만 사용해야한다고 지적합니다.
import collections; Matrix = collections.defaultdict(float)
초기화되지 않은 요소를 0으로 대체하기 위해을 수행 할 수도 있습니다 .
파이썬에서는리스트리스트를 만들 것입니다. 치수를 미리 선언 할 필요는 없지만 가능합니다. 예를 들면 다음과 같습니다.
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)]
extend
첫 번째 경우에도 도움이 될 것입니다.로 시작 m = [[]]
하면을 사용하여 내부 목록에 추가하고 (행 확장) m[0].extend([1,2])
을 사용하여 외부 목록에 추가 (새 행 추가) m.append([3,4])
할 수 있습니다 [[1, 2], [3, 4]]
.
목록의 목록을 작성해야하며 가장 좋은 방법은 중첩 된 이해를 사용하는 것입니다.
>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(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]]
당신에 [5][5]
예를 들어, 당신은 정수 "5"내부에있는 목록을 작성, 그것의 5 항목에 액세스하려고, 더 5 항목이 없기 때문에 그것은 자연스럽게 IndexError를 제기하고 있습니다 :
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
rows = int(input())
cols = int(input())
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0)
matrix.append(row)
print(matrix)
왜 그렇게 긴 코드가 필요한 Python
가요?
오랫동안 파이썬에 익숙하지 않았을 때 2D 행렬 작성에 대한 한 줄 답변을 보았고 파이썬에서 다시 2D 행렬을 사용하지 않을 것이라고 말했습니다. (이 한 줄은 꽤 무서웠으며 파이썬이하고있는 일에 대한 정보를주지 못했습니다. 또한 이러한 속기에 대해 알지 못합니다.)
어쨌든, 여기 C, CPP 및 Java 배경에서 온 초보자를위한 코드가 있습니다.
파이썬 애호가와 전문가에 대한 참고 사항 : 자세한 코드를 작성했기 때문에 투표하지 마십시오.
쉽게 읽을 수 있도록 다시 작성 :
# 2D array/ matrix
# 5 rows, 5 cols
rows_count = 5
cols_count = 5
# create
# creation looks reverse
# create an array of "cols_count" cols, for each of the "rows_count" rows
# all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]
# index is from 0 to 4
# for both rows & cols
# since 5 rows, 5 cols
# use
two_d_array[0][0] = 1
print two_d_array[0][0] # prints 1 # 1st row, 1st col (top-left element of matrix)
two_d_array[1][0] = 2
print two_d_array[1][0] # prints 2 # 2nd row, 1st col
two_d_array[1][4] = 3
print two_d_array[1][4] # prints 3 # 2nd row, last col
two_d_array[4][4] = 4
print two_d_array[4][4] # prints 4 # last row, last col (right, bottom element of matrix)
사용하다:
matrix = [[0]*5 for i in range(5)]
첫 번째 차원의 * 5는이 수준에서 데이터를 변경할 수 없기 때문에 작동합니다.
matrix = [[0]*cols for _ in range(rows)]
0의 행렬을 선언하려면 :
numpy.zeros((x, y))
예 :
>>> numpy.zeros((3, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
또는 numpy.ones ((x, y)) 예
>>> np.ones((3, 5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
3 차원도 가능합니다. ( http://www.astro.ufl.edu/~warner/prog/python.html 참조-> 다차원 배열)
NumPy를 사용하면 다음과 같이 빈 행렬을 초기화 할 수 있습니다.
import numpy as np
mm = np.matrix([])
나중에 다음과 같은 데이터를 추가하십시오.
mm = np.append(mm, [[1,2]], axis=1)
목록 목록 (내 의견으로는 훨씬 자연 스럽습니다)의 관점에서 생각하지 않고 2D 배열로 생각하고 싶다면 다음을 수행 할 수 있습니다.
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
결과는 NumPy 배열이 아닌 목록이며 숫자, 문자열 등으로 개별 위치를 덮어 쓸 수 있습니다.
numpy.matrix
에 해당 numpy.zeros
목록을받지 않고 0이 붙지 않는?
matrix = {}
두 가지 방법으로 키 와 값 을 정의 할 수 있습니다 .
matrix[0,0] = value
또는
matrix = { (0,0) : value }
결과:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
사용하다:
import copy
def ndlist(*args, init=0):
dp = init
for x in reversed(args):
dp = [copy.deepcopy(dp) for _ in range(x)]
return dp
l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1
NumPy가 갈 길이라고 생각합니다. 위의 내용은 NumPy를 사용하지 않으려는 경우 일반적인 것입니다.
list를 사용하여 :
matrix_in_python = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]
dict를 사용하여 : 빠른 검색을 위해 해시 테이블 에이 정보를 저장할 수도 있습니다.
matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};
행렬 [ '1']은 O (1) 시간의 결과를 제공합니다
* nb : 해시 테이블에서 충돌을 처리해야합니다.
시작하기 전에 크기 정보가 없으면 두 개의 1 차원 목록을 작성하십시오.
list 1: To store rows
list 2: Actual two-dimensional matrix
전체 행을 첫 번째 목록에 저장하십시오. 완료되면 목록 1을 목록 2에 추가하십시오.
from random import randint
coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
randomx=randint(0,1000)
randomy=randint(0,1000)
temp=[]
temp.append(randomx)
temp.append(randomy)
coordinates.append(temp)
print coordinates
산출:
Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5
이 짧은 표현에주의하십시오. @ FJ의 답변에서 자세한 설명을 참조하십시오
Matrix[0], Matrix[1], ..., Matrix[4]
같은 배열에 대한 모든 점, 그래서 한 후 Matrix[0][0] = 3
, 당신이 기대하는 것입니다 Matrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.
l=[[0]*(L) for _ in range(W)]
다음보다 빠릅니다.
l = [[0 for x in range(L)] for y in range(W)]
[[0]*(L) for i in range(W)]
해야 [[0]*(L) for _ in range(W)]
하기 때문에 i
사용 어디서나 아니다
다음과 같이 두 개 이상의 정사각형 브레이스 또는 세 번째 괄호 ( []
쉼표로 구분)를 쉼표로 구분 하여 빈 2 차원 목록을 만들 수 있습니다 .
Matrix = [[], []]
이제 1을 추가하고 Matrix[0][0]
다음을 입력 한다고 가정하십시오 .
Matrix[0].append(1)
이제 Matrix를 입력하고 Enter를 누르십시오. 출력은 다음과 같습니다.
[[1], []]
다음은 파이썬에서 행렬을 만들기위한 코드 스 니펫입니다.
# get the input rows and cols
rows = int(input("rows : "))
cols = int(input("Cols : "))
# initialize the list
l=[[0]*cols for i in range(rows)]
# fill some random values in it
for i in range(0,rows):
for j in range(0,cols):
l[i][j] = i+j
# print the list
for i in range(0,rows):
print()
for j in range(0,cols):
print(l[i][j],end=" ")
내가 놓친 것이 있으면 제안하십시오.