如何定义二维数组?

我想定义一个没有初始化长度的二维数组,如下所示:

Matrix = [][]

但这给出了一个错误:

IndexError:列表索引超出范围

2812948 次浏览

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

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

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

Matrix[0][0] = 1Matrix[6][0] = 3 # error! range...Matrix[0][6] = 3 # valid

请注意,矩阵是“y”地址主键,换句话说,“y索引”位于“x索引”之前。

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

虽然你可以根据自己的意愿命名它们,但我这样看待它是为了避免索引可能出现的一些混乱,如果你对内部和外部列表都使用“x”,并且想要一个非方形矩阵。

如果你想创建一个空矩阵,正确的语法是

matrix = [[]]

如果你想生成一个填充0的5号矩阵,

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

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

>>> 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]示例中,您正在创建一个包含整数“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

在Python中,您将创建一个列表列表。您不必提前声明维度,但您可以。例如:

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

现在矩阵[0][0]==2和矩阵[1][0]==3。您还可以使用列表理解语法。此示例使用它两次来构建“二维列表”:

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

如果你真的想要一个矩阵,你最好使用numpynumpy中的矩阵操作通常使用二维数组类型。创建新数组的方法有很多;最有用的方法之一是zeros函数,它接受一个形状参数并返回一个给定形状的数组,值初始化为零:

>>> 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.arange(25).reshape((5, 5))         # create a 1-d range and reshapenumpy.array(range(25)).reshape((5, 5))   # pass a Python range and reshapenumpy.array([5] * 25).reshape((5, 5))    # pass a Python list and reshapenumpy.empty((5, 5))                      # allocate, but don't initializenumpy.ones((5, 5))                       # initialize with ones

numpy也提供了matrix类型,但它是任何使用的不再建议,将来可能会从numpy中删除。

以下是初始化列表列表的较短表示法:

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

我读到逗号分隔的文件,如下所示:

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

然后,列表“data”是具有索引数据[row][coll]的列表列表

要声明一个零(one)矩阵:

numpy.zeros((x, y))

e. g.

>>> 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参见-->多维数组)

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

小心这个简短的表达,请参阅@F. J的答案中的完整解释

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

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

以便

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

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

Matrix = {}

然后你可以做:

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

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

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

瓦特萨尔进一步指出,这种方法对于大型矩阵可能不是很有效,应该只在代码的非性能关键部分使用。

用途:

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

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

用途:

import copy
def ndlist(*args, init=0):dp = initfor 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'sl[0][1][2][3] = 1

我确实认为NumPy是可行的方法。如果您不想使用NumPy,以上是通用的。

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

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

导致

[[], [], []]

重写以方便阅读:

# 2D array/ matrix
# 5 rows, 5 colsrows_count = 5cols_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 0two_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
# usetwo_d_array[0][0] = 1print two_d_array[0][0]  # prints 1   # 1st row, 1st col (top-left element of matrix)
two_d_array[1][0] = 2print two_d_array[1][0]  # prints 2   # 2nd row, 1st col
two_d_array[1][4] = 3print two_d_array[1][4]  # prints 3   # 2nd row, last col
two_d_array[4][4] = 4print two_d_array[4][4]  # prints 4   # last row, last col (right, bottom element of matrix)

如果您希望能够将其视为2D数组,而不是被迫根据列表列表进行思考(在我看来更自然),您可以执行以下操作:

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

结果是一个列表(不是NumPy数组),您可以用数字、字符串等覆盖各个位置。

字典就是为了这个!

matrix = {}

您可以通过两种方式定义

matrix[0,0] = value

matrix = { (0,0)  : value }

结果:

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

如果在开始之前没有大小信息,则创建两个一维列表。

list 1: To store rowslist 2: Actual two-dimensional 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]]

使用NumPy,你可以像这样初始化空矩阵:

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

然后像这样附加数据:

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

通过使用列表:

matrix_in_python  = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]

使用字典:您还可以将此信息存储在哈希表中以进行快速搜索,例如

matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};

矩阵['1']将在O(1)时间内给出结果

*nb:您需要处理哈希表中的碰撞

这就是我通常在python中创建2D数组的方式。

col = 3row = 4array = [[0] * col for _ in range(row)]

与在列表理解中使用两个for循环相比,我发现这种语法很容易记住。

这是来自C,CPP和Java背景的初学者的代码

rows = int(input())cols = int(input())
matrix = []for i in range(rows):row = []for j in range(cols):row.append(0)matrix.append(row)
print(matrix)

为什么这么长的代码,太在Python你问?

很久以前,当我对Python不太熟悉的时候,我看到了写2D矩阵的单行答案,并告诉自己我不会再在Python中使用二维矩阵了。(那些单行非常可怕,它没有给我任何关于Python在做什么的信息。还要注意,我不知道这些速记。)

l=[[0]*(L) for _ in range(W)]

将快于:

l = [[0 for x in range(L)] for y in range(W)]

试试这个:

rows = int(input('Enter rows\n'))my_list = []for i in range(rows):my_list.append(list(map(int, input().split())))

如果您需要具有预定义数字的矩阵,您可以使用以下代码:

def matrix(rows, cols, start=0):return [[c + start + r * cols for c in range(cols)] for r in range(rows)]

assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]

您可以通过嵌套两个或多个方括号或第三方括号([],用逗号分隔)和方括号来创建一个空的二维列表,如下所示:

Matrix = [[], []]

现在假设您想将1附加到Matrix[0][0],然后键入:

Matrix[0].append(1)

现在,键入Matrix并按回车键。输出将是:

[[1], []]

如果您改为输入以下语句

Matrix[1].append(1)

那么母体就会是

[[], [1]]

这是在python中创建矩阵的代码片段:

# get the input rows and colsrows = int(input("rows : "))cols = int(input("Cols : "))
# initialize the listl=[[0]*cols for i in range(rows)]
# fill some random values in itfor i in range(0,rows):for j in range(0,cols):l[i][j] = i+j
# print the listfor i in range(0,rows):print()for j in range(0,cols):print(l[i][j],end=" ")

如果我错过了什么,请建议。

用户定义输入矩阵和打印的函数

def inmatrix(m,n):#Start function and pass row and column as parametera=[] #create a blank matrixfor i in range(m): #Row inputb=[]#blank listfor j in range(n): # column inputelm=int(input("Enter number in Pocket ["+str(i)+"]["+str(j)+"] ")) #Show Row And column  numberb.append(elm) #add value to b lista.append(b)# Add list to matrixreturn  a #return Matrix
def Matrix(a): #function for print Matrixfor i in range(len(a)): #rowfor j in range(len(a[0])): #columnprint(a[i][j],end=" ") #print value with spaceprint()#print a line After a row print
m=int(input("Enter number of row")) #input rown=int(input("Enter number of column"))a=inmatrix(m,n) #call input matrix function
print("Matrix is ... ")
Matrix(a) #print matrix function

通常,go-to模块是NumPy:

import numpy as np   
# Generate a random matrix of floatsnp.random.rand(cols,rows)
# Generate a random matrix of integersnp.random.randint(1, 10, size=(cols,rows))

如果您想创建一个二维矩阵,该矩阵的维度由两个变量定义,并使用其所有元素的默认值对其进行初始化。您可以使用这个简单的语法

n_rows=3n_cols=4aux_matrix= [[1]*n_cols]*n_rows