2014-10-03 88 views
-1

我正在尝试在python中创建一个3x3矩阵类。我无法正确初始化2D阵列。在Python中初始化类中的二维数组

在下面的代码中,我得到一个错误,表示Matrix3x3没有属性m。如果我在init之前初始化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

不要添加'm'作为参数init..just在构造函数中声明m – Abhi 2014-10-03 18:08:02

+0

[在Python中定义类变量的正确方法]的可能重复(http://stackoverflow.com/questions/9056957/correct-way-在-python中定义类变量) – Abhi 2014-10-03 18:10:41

+0

忘记'm',只用'self.m = [[for for xrange(3)] for _ in xrange(3)]' – 2014-10-03 18:31:47

回答

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 2014-10-03 19:11:39

-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起初不是百分之百的,但是窝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

这是如何创建列表的列表? – 2014-10-03 18:14:25

+0

@PadraicCunningham Oups,使用了错误的大括号:post edited – 2014-10-03 18:28:45