2014-10-03 2 views
-1

Я пытаюсь создать класс матрицы 3x3 в python. У меня возникают трудности с инициализацией 2D-массива.Инициализировать 2D-массив в классе в Python

В следующем коде появляется сообщение о том, что Matrix3x3 не имеет атрибута m. Если я инициализирую m до init, кажется, что «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

Не добавляйте 'm' в качестве аргумента для init..just объявите m в конструкторе – Abhi

+0

возможной дубликат [правильный способ определения переменных класса в Python] (http://stackoverflow.com/questions/9056957/correct-way- to-define-class-variables-in-python) – Abhi

+0

забыть о 'm' и просто использовать' self.m = [[0 для _ в xrange (3)] для _ в xrange (3)] ' –

ответ

1

Проблема заключается в том, что m должен существовать перед вами может установить его элементы, и даже тогда попытка установить значение элемента в списке не удастся, если список слишком короткий. Так

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

Этот класс будет генерировать матрицу 3х3

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

может быть расширена на создание матриц размера X

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

Попробуйте это :)

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

Mayby сначала не на 100%, но wo RKS :)

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

или даже лучше непосредственно:

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, использовал неправильные фигурные скобки: пост отредактировал –

Смежные вопросы