我正在尝试在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];
答案 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]]