Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中初始化类中的2D数组_Python_Class_Multidimensional Array - Fatal编程技术网

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

在Python中初始化类中的2D数组,python,class,multidimensional-array,Python,Class,Multidimensional Array,我试图用python创建一个3x3矩阵类。我无法正确初始化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

我试图用python创建一个3x3矩阵类。我无法正确初始化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];

此类将生成一个矩阵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]]
试试这个:)


Mayby一开始不是100%可读的,但可以工作:)

在设置其元素之前,必须将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) ]

问题是
m
必须存在才能设置其元素,即使如此,如果列表太短,尝试设置列表中元素的值也将失败。所以

lst = []
lst[0] = 0
将失败,但

lst = []
lst.append(0)
我们会成功的
lst[0]=0
应视为试图更改索引
0
lst
的值,如果
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)

另外,如果这不是对某种类型的赋值,你应该考虑使用,它有一组内置的矩阵运算,而不是试图滚动自己。

不要将<代码> m <代码>作为init的参数。只要在可能的重复结构中声明M“忘记<代码> m < /代码>,只使用<代码>[0代表uu-in-xrange(3)]代表u-in-xrange(3)]你到底为什么需要这个?矩阵和数组解决方案已经存在,特别是看numpy。这是如何创建列表的?@padraickenningham-Oups,使用了错误的大括号:对响应进行了后期编辑。我看了一会儿后意识到这一点。
from copy import deepcopy

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