如何在Python中定义一个二维数组

我想定义一个没有初始化长度的二维数组,像这样:

Matrix = [][] 

但它不工作…

我已经尝试了下面的代码,但它也是错误的:

 Matrix = [5][5] 

错误:

 Traceback ... IndexError: list index out of range 

我的错误是什么?

你在技术上试图索引一个未初始化的数组。 在添加项目之前,您必须首先使用列表初始化外部列表; Python称之为“列表理解”。

 # Creates a list containing 5 lists, each of 8 items, all set to 0 w, h = 8, 5; Matrix = [[0 for x in range(w)] for y in range(h)] 

您现在可以将项目添加到列表中:

 Matrix[0][0] = 1 Matrix[6][0] = 3 # error! range... Matrix[0][6] = 3 # valid print Matrix[0][0] # prints 1 x, y = 0, 6 print Matrix[x][y] # prints 3; be careful with indexing! 

虽然你可以按照你的意愿命名,但是我可以这样看,以避免在编制索引时出现一些混淆,如果你使用“x”作为内部和外部列表,并且需要一个非方形matrix。

如果你真的想要一个matrix,你可能会更好使用numpynumpymatrix操作最经常使用具有两个维度的数组types。 有很多方法来创build一个新的数组; 其中一个最有用的就是zerosfunction,该function采用形状参数并返回给定形状的数组,其值初始化为零:

 >>> import numpy >>> numpy.zeros((5, 5)) array([[ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.]]) 

numpy提供了matrixtypes。 这是不常用的,有人build议不要使用它。 但是对于来自Matlab以及其他一些环境的人来说,这是非常有用的。 因为我们正在谈论matrix,所以我想包括它。

 >>> numpy.matrix([[1, 2], [3, 4]]) matrix([[1, 2], [3, 4]]) 

下面是创build二维数组和matrix的其他一些方法(为了紧凑而去除了输出):

 numpy.matrix('1 2; 3 4') # use Matlab-style syntax numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape numpy.empty((5, 5)) # allocate, but don't initialize numpy.ones((5, 5)) # initialize with ones numpy.ndarray((5, 5)) # use the low-level constructor 

以下是初始化列表清单的简短表示法:

 matrix = [[0]*5 for i in range(5)] 

不幸的是缩短到5*[5*[0]]类的东西实际上并不起作用,因为你最终得到了5个相同列表的副本,所以当你修改其中的一个时,它们都会改变,例如:

 >>> matrix = 5*[5*[0]] >>> matrix [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] >>> matrix[4][4] = 2 >>> matrix [[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]] 

如果你想创build一个空matrix,正确的语法是

 matrix = [[]] 

如果你想生成一个填充0的大小为5的matrix,

 matrix = [[0 for i in xrange(5)] for i in xrange(5)] 

如果你只想要一个二维容器来容纳一些元素,你可以方便地使用一个字典:

 Matrix = {} 

那你可以这样做:

 Matrix[1,2] = 15 print Matrix[1,2] 

这是有效的,因为1,2是一个元组,并且您将它用作索引字典的键。 结果类似于一个哑稀疏matrix。

如osa和Josap Valls所示,您还可以使用Matrix = collections.defaultdict(lambda:0)以便缺less的元素的默认值为0

Vatsal进一步指出,这种方法对于大型matrix可能不是非常有效,只能用于代码的非性能关键部分。

在Python中,您将创build列表的列表。 您不必提前声明尺寸,但可以。 例如:

 matrix = [] matrix.append([]) matrix.append([]) matrix[0].append(2) matrix[1].append(3) 

现在matrix[0] [0] == 2和matrix[1] [0] == 3.您也可以使用列表parsing语法。 这个例子使用它两次来build立一个“二维列表”:

 from itertools import count, takewhile matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)] 

接受的答案是好的和正确的,但是我花了一段时间才明白,我也可以用它来创build一个完全空的数组。

 l = [[] for _ in range(3)] 

结果是

 [[], [], []] 

你应该列出一个列表,最好的方法是使用嵌套理解:

 >>> matrix = [[0 for i in range(5)] for j in range(5)] >>> pprint.pprint(matrix) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

在你的[5][5]例子中,你正在创build一个带有整数“5”的列表,并尝试访问它的第5个项目,这自然会引发IndexError,因为没有第5个项目:

 >>> l = [5] >>> l[5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range 

声明零(matrix)的matrix:

 numpy.zeros((x, y)) 

例如

 >>> numpy.zeros((3, 5)) array([[ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.]]) 

或numpy.ones((x,y))例如

 >>> np.ones((3, 5)) array([[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]]) 

甚至三个维度都是可能的。 ( http://www.astro.ufl.edu/~warner/prog/python.html请参阅; – >multidimensional array)

重写容易阅读:

 # 2D array/ matrix # 5 rows, 5 cols rows_count = 5 cols_count = 5 # create # creation looks reverse # create an array of "cols_count" cols, for each of the "rows_count" rows # all elements are initialized to 0 two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)] # index is from 0 to 4 # for both rows & cols # since 5 rows, 5 cols # use two_d_array[0][0] = 1 print two_d_array[0][0] # prints 1 # 1st row, 1st col (top-left element of matrix) two_d_array[1][0] = 2 print two_d_array[1][0] # prints 2 # 2nd row, 1st col two_d_array[1][4] = 3 print two_d_array[1][4] # prints 3 # 2nd row, last col two_d_array[4][4] = 4 print two_d_array[4][4] # prints 4 # last row, last col (right, bottom element of matrix) 

我读了逗号分隔的文件是这样的:

 data=[] for l in infile: l = split(',') data.append(l) 

然后列表“数据”是索引数据[行] [列]

 # Creates a list containing 5 lists initialized to 0 Matrix = [[0]*5]*5 

注意这个简短的expression,在@ FJ的答案中看到完整的解释

我在我的第一个Python脚本,我有点困惑的方阵示例,所以我希望下面的例子将帮助您节省一些时间:

  # Creates a 2 x 5 matrix Matrix = [[0 for y in xrange(5)] for x in xrange(2)] 

以便

 Matrix[1][4] = 2 # Valid Matrix[4][1] = 3 # IndexError: list index out of range 

这是字典是为了!

 matrix = {} 

您可以通过两种方式定义

 matrix[0,0] = value 

要么

 matrix = { (0,0) : value } 

结果:

  [ value, value, value, value, value], [ value, value, value, value, value], ... 

使用:

 matrix = [[0]*5 for i in range(5)] 

第一维的* 5是可行的,因为在这个级别数据是不可变的。

使用:

 import copy def ndlist(*args, init=0): dp = init for x in reversed(args): dp = [copy.deepcopy(dp) for _ in range(x)] return dp l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's l[0][1][2][3] = 1 

我认为NumPy是要走的路。 如果你不想使用NumPy,以上是一个通用的。

如果你想能够把它想象成一个二维数组,而不是被迫从列表的angular度去思考(在我看来更自然的话),你可以这样做:

 import numpy Nx=3; Ny=4 my2Dlist= numpy.zeros((Nx,Ny)).tolist() 

结果是一个列表(而不是一个NumPy数组),你可以用数字,string等来覆盖每个位置。

使用NumPy你可以像这样初始化空matrix:

 import numpy as np mm = np.matrix([]) 

后来追加这样的数据:

 mm = np.append(mm, [[1,2]], axis=1) 

如果您在开始之前没有尺寸信息,请创build两个一维列表。

列表1:存储行列表2:实际的二维matrix

将整个行存储在第一个列表中。 完成后,将列表1追加到列表2中:

 from random import randint coordinates=[] temp=[] points=int(raw_input("Enter No Of Coordinates >")) for i in range(0,points): randomx=randint(0,1000) randomy=randint(0,1000) temp=[] temp.append(randomx) temp.append(randomy) coordinates.append(temp) print coordinates 

输出:

 Enter No Of Coordinates >4 [[522, 96], [378, 276], [349, 741], [238, 439]]