2014-10-03 6 views
-1

파이썬에서 3x3 매트릭스 클래스를 만들려고합니다. 2D 배열을 올바르게 초기화하는 데 어려움이 있습니다.파이썬에서 클래스의 2D 배열 초기화

다음 코드에서는 Matrix3x3에 특성 m이 없다는 오류가 표시됩니다. 앞에 m을 초기화하면 'm'이 정적 변수처럼 작동하는 것처럼 보이므로 원하지 않습니다.

class Matrix3x3: 
    #[1 0 0] 
    #[0 1 0] 
    #[0 0 1] 
    def __init__(self, m): 
     #self.m[row][column] 
     self.m[0][0] = m[0][0]; 
     self.m[0][1] = m[0][1]; 
     self.m[0][2] = m[0][2]; 

     self.m[1][0] = m[1][0]; 
     self.m[1][1] = m[1][1]; 
     self.m[1][2] = m[1][2]; 

     self.m[2][0] = m[2][0]; 
     self.m[2][1] = m[2][1]; 
     self.m[2][2] = m[2][2]; 
+0

init에'm'을 추가하지 말아라. 생성자 내에서 m을 선언한다. – Abhi

+0

[가능한 파이썬에서 클래스 변수를 정의하는 올바른 방법] (http://stackoverflow.com/questions/9056957/correct-way- 파이썬에서 정의 클래스 변수들) – Abhi

+0

'm'을 잊어 버리고 'self.m = [xrange (3)에서 _에 대해 _ [xrange (3)에서]]' –

답변

1

그 요소를 설정할 수 있고, 심지어 목록에있는 요소의 값을 설정하려해도 목록이 너무 짧으면 실패합니다. 그래서

lst = [] 
lst[0] = 0 

실패하지만

lst = [] 
lst.append(0) 

성공합니다. lst[0] = 0은 으로 변경해야한다고 생각해야합니다. lst의 값이 0이고 lst의 인덱스가 0 인 경우 사용할 수 없습니다. 그러나

, 중 지능형리스트와 무엇 당신이 원하는 할 수있는 간단한 방법,

class Matrix3x3: 
    def __init__(self, m): 
     self.m = [[m[i][j] for j in xrange(len(m[i]))] for i in xrange(len(m))] 

또는 deepcopy, 당신은 입력 변경 계획이없는 경우 : 또한

from copy import deepcopy 

class Matrix3x3: 
    def __init__(self, m): 
     self.m = deepcopy(m) 

을 , 이것이 일종의 임무가 아니라면, 대신에 자신의 것을 굴리려 고 시도하는 대신, 행렬 연산이 내장 된 numpy.matrix을 사용하는 것을 고려해야합니다.

+0

응답 해 주셔서 감사합니다. 나는 그것을 잠시 보면서 깨달았다. – user2970916

-1

이 클래스는

class Matrix3x3: 
    def __init__(self): 
     self.m = [] 
     for item in range(3): 
      self.m.append([0,0,0]) 


mat = Matrix3x3() 
print(mat.m) 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

이 :) 시도

class Matrix_x_sized: 
    def __init__(self,x): 
     self.m = [] 
     for item in range(x): 
      self.m.append([0]*x) 

mat2 = Matrix_x_sized(4) 
mat2.m 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
0

을 X 크기의 행렬을 만들 때 확장 할 수있는 매트릭스 3 × 3을 생성합니다

matrix_size = 3 
Matrix = [[1 if x==y else 0 for y in xrange(matrix_size)] for x in xrange(matrix_size)] 

Mayby 처음에는 100 % readeble이 아니지만 wo RKS : 당신은 그것의 요소를 설정하기 전에 목록의 목록으로 m를 할당해야

0

:

class Matrix3x3: 
    #[1 0 0] 
    #[0 1 0] 
    #[0 0 1] 
    def __init__(self, m): 
     #allocate the lists : m is a list containing 3 lists of 3 None values 
     self.m = [ [ None for j in range(3) ] for i in range(3) ] 
     for i in range(3): 
      for j in range(3): 
       self.m[i][j] = m[i][j]; 

또는 더 나은 직접 : 문제는 m 요구하기 전에 존재한다는 것입니다

class Matrix3x3: 
    #[1 0 0] 
    #[0 1 0] 
    #[0 0 1] 
    def __init__(self, m): 
     # directly init self.m 
     self.m = [ [ m[i][j] for j in range(3) ] for i in range(3) ] 
+0

이것이 어떻게 목록 목록을 만드나요? –

+0

@PadraicCunningham Oups, 잘못된 중괄호 사용 : 수정 된 게시물 –