我想定义一个没有初始化长度的二维数组,如下所示:
Matrix = [][]
但这给出了一个错误:
IndexError:列表索引超出范围
我想定义一个没有初始化长度的二维数组,如下所示:
Matrix = [][]
但这给出了一个错误:
IndexError:列表索引超出范围
当前回答
如果您希望能够将其视为2D阵列,而不是被迫根据列表进行思考(在我看来更自然),可以执行以下操作:
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
结果是一个列表(不是NumPy数组),您可以用数字、字符串等覆盖各个位置。
其他回答
从技术上讲,您正在尝试对未初始化的数组进行索引。在添加项目之前,必须先用列表初始化外部列表;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”,并且希望使用非方形矩阵。
如果你只需要一个二维容器来容纳一些元素,你可以方便地使用字典来代替:
Matrix = {}
然后您可以执行以下操作:
Matrix[1,2] = 15
print Matrix[1,2]
这是因为1,2是一个元组,您将其用作索引字典的键。结果类似于哑稀疏矩阵。
如osa和Josap Valls所示,您还可以使用Matrix=collections.defaultdict(lambda:0),以便丢失的元素具有默认值0。
Vatsal进一步指出,这种方法对于大型矩阵可能不是很有效,只应在代码的非性能关键部分使用。
我正在编写我的第一个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
使用NumPy,可以如下初始化空矩阵:
import numpy as np
mm = np.matrix([])
然后像这样附加数据:
mm = np.append(mm, [[1,2]], axis=1)
如果要创建空矩阵,正确的语法是
matrix = [[]]
如果你想生成一个大小为5、填充有0的矩阵,
matrix = [[0 for i in xrange(5)] for i in xrange(5)]