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

Initialize a 2D Array in a Class in Python

我尝试在python中创建一个3x3矩阵类。我很难正确初始化二维数组。

在下面的代码中,我得到一个错误,说matrix3x3没有属性m。如果我在in it之前初始化m,它看起来像是一个静态变量,我不想这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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];


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

1
2
lst = []
lst[0] = 0

会失败但

1
2
lst = []
lst.append(0)

会成功的。应将lst[0] = 0视为试图改变0指数处lst的价值,如果lst没有0指数,则不能使用。

然而,做你想做的事情的最简单的方法是用列表理解,

1
2
3
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,如果您不打算更改输入:

1
2
3
4
5
from copy import deepcopy

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

此外,如果这不是为了某种类型的分配,您应该考虑使用numpy.matrix,它有一系列内置的矩阵操作,而不是尝试自己滚动。


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

1
2
3
4
5
6
7
8
9
10
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];

或者更直接地说:

1
2
3
4
5
6
7
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) ]


试试这个:

1
2
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,但起作用:)


此类将生成矩阵3x3

1
2
3
4
5
6
7
8
9
10
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大小的矩阵

1
2
3
4
5
6
7
8
9
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]]