如何定义二维数组?[重复]

2024-11-28 08:37:00
admin
原创
172
摘要:问题描述:我想定义一个没有初始化长度的二维数组,如下所示:Matrix = [][] 但这会出现错误:IndexError:列表索引超出范围解决方案 1:从技术上讲,您是在尝试索引未初始化的数组。您必须先使用列表初始化外部列表,然后再添加项目;Python 将此称为“列表推导”。# Creates a lis...

问题描述:

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

Matrix = [][]

但这会出现错误:

IndexError:列表索引超出范围


解决方案 1:

从技术上讲,您是在尝试索引未初始化的数组。您必须先使用列表初始化外部列表,然后再添加项目;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

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

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

尽管您可以按照自己的意愿命名它们,但是我以这种方式看待它,以避免索引时可能出现的一些混淆,如果您对内部和外部列表都使用“x”,并且想要一个非方阵。

解决方案 2:

如果你真的想要一个矩阵,那么使用 可能会更好numpy。矩阵运算numpy最常使用二维数组类型。创建新数组的方法有很多种;最有用的方法之一是 函数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 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`matrix也提供了一种类型,但不再推荐用于*任何*numpy`用途,并且将来可能会被删除。

解决方案 3:

以下是初始化列表列表的简短符号:

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

解决方案 4:

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

matrix = [[]]

如果你想生成一个大小为 5 并用 0 填充的矩阵,

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

解决方案 5:

如果您想要的只是一个二维容器来保存一些元素,那么您可以方便地使用字典:

Matrix = {}

然后你可以这样做:

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

这是可行的,因为1,2它是一个元组,并且您使用它作为索引字典的键。结果类似于一个愚蠢的稀疏矩阵。

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

Vatsal 进一步指出,这种方法对于大型矩阵来说可能不是很有效,并且只应该在代码中非性能关键部分使用。

解决方案 6:

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

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

现在 matrix0 == 2 并且 matrix1 == 3。您还可以使用列表推导语法。此示例使用它两次来构建“二维列表”:

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

解决方案 7:

这是针对具有 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 时,我看到了编写二维矩阵的单行答案,并告诉自己我不会再在 Python 中使用二维矩阵了。(这些单行答案非常可怕,它没有给我任何有关 Python 正在做什么的信息。另请注意,我不知道这些简写。)

解决方案 8:

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

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

结果是

[[], [], []]

解决方案 9:

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

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

解决方案 10:

这是我通常在 python 中创建二维数组的方法。

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

与列表推导中使用两个 for 循环相比,我发现这种语法更容易记住。

解决方案 11:

使用:

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

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

解决方案 12:

声明一个由零(一)组成的矩阵:

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

解决方案 13:

为方便阅读,重写如下:

# 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)

解决方案 14:

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

Matrix = [[], []]

现在假设您想要附加 1,Matrix[0][0]然后输入:

Matrix[0].append(1)

现在,输入 Matrix 并按 Enter。输出将是:

[[1], []]

如果你输入的是以下语句

Matrix[1].append(1)

那么矩阵将是

[[], [1]]

解决方案 15:

这是我的第一个 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

解决方案 16:

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

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

然后附加如下数据:

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

解决方案 17:

我读了如下以逗号分隔的文件:

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

列表“数据”是具有索引数据row的列表的列表

解决方案 18:

这就是字典的用途!

matrix = {}

您可以通过两种方式定义值:

matrix[0,0] = value

或者

matrix = { (0,0)  : value }

结果:

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

解决方案 19:

如果您希望将其视为二维数组,而不是被迫以列表列表的形式思考(在我看来更自然),您可以执行以下操作:

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

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

解决方案 20:

使用:

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,以上是通用方法。

解决方案 21:

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

将比以下更快:

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

解决方案 22:

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

list 1: To store rows
list 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]]

解决方案 23:

通过使用列表:

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

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

*nb:你需要处理哈希表中的冲突

解决方案 24:

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

请小心这个简短的表达,请参阅@FJ 的回答中的完整解释

解决方案 25:

以下是用 Python 创建矩阵的代码片段:

# get the input rows and cols
rows = int(input("rows : "))
cols = int(input("Cols : "))

# initialize the list
l=[[0]*cols for i in range(rows)]

# fill some random values in it
for i in range(0,rows):
    for j in range(0,cols):
        l[i][j] = i+j

# print the list
for i in range(0,rows):
    print()
    for j in range(0,cols):
        print(l[i][j],end=" ")

如果我遗漏了什么,请提出建议。

解决方案 26:

通常,首选模块是 NumPy:

import numpy as np
   
# Generate a random matrix of floats
np.random.rand(cols,rows)

# Generate a random matrix of integers
np.random.randint(1, 10, size=(cols,rows))

解决方案 27:

尝试一下:

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

解决方案 28:

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

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

解决方案 29:

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

def inmatrix(m,n):
    #Start function and pass row and column as parameter
    a=[] #create a blank matrix
    for i in range(m): #Row input
        b=[]#blank list
        for j in range(n): # column input
            elm=int(input("Enter number in Pocket ["+str(i)+"]["+str(j)+"] ")) #Show Row And column  number 
            b.append(elm) #add value to b list
        a.append(b)# Add list to matrix
    return  a #return Matrix 

def Matrix(a): #function for print Matrix
    for i in range(len(a)): #row
        for j in range(len(a[0])): #column
            print(a[i][j],end=" ") #print value with space
        print()#print a line After a row print

m=int(input("Enter number of row")) #input row
n=int(input("Enter number of column"))
a=inmatrix(m,n) #call input matrix function 

print("Matrix is ... ")

Matrix(a) #print matrix function

解决方案 30:

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

n_rows=3
n_cols=4
aux_matrix= [[1]*n_cols]*n_rows
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用