在Python中初始化类中的2D数组

时间:2014-10-03 18:03:14

标签: python class multidimensional-array

我正在尝试在python中创建一个3x3 Matrix类。我无法正确初始化2D数组。

在下面的代码中,我收到一条错误消息,指出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];

4 个答案:

答案 0 :(得分:1)

问题是m需要存在才能设置其元素,即使这样,如果列表太短,尝试设置列表中元素的值也会失败。所以

lst = []
lst[0] = 0

会失败,但

lst = []
lst.append(0)

会成功。 lst[0] = 0应该被视为试图更改索引lst的{​​{1}}的值,并且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,它具有一堆内置矩阵运算,而不是尝试自行推送。

答案 1 :(得分:0)

试试这个:)

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

最初可能不是100%可读,但有效:)

答案 2 :(得分:0)

在设置元素之前,您必须将m分配为列表列表:

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

答案 3 :(得分:-1)

该类将生成矩阵3x3

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