python二维数组赋值 - python数组array



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

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

Matrix = [][]

但它不起作用...

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

Matrix = [5][5]

错误:

Traceback ...

IndexError: list index out of range

我的错误是什么?

https://src-bin.com


Answer #1

这就是字典是为了!

matrix = {}

您可以通过两种方式定义

matrix[0,0] = value

要么

matrix = { (0,0)  : value }

结果:

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

Answer #2

重写容易阅读:

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

Answer #3

你在技术上试图索引未初始化的数组。 在添加项目之前,您必须首先用列表初始化外部列表; 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”,并且需要非矩形矩阵。


Answer #4

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

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

Answer #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,以上是通用的。


Answer #6

使用:

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

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


Answer #7

声明零(矩阵)矩阵:

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


Answer #8

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

Matrix = {}

那你可以这样做:

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

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

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

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


Answer #9

如果你真的想要一个矩阵,你最好使用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提供matrix类型。 它不常用,有些人建议不要使用它。 但对于来自Matlab以及其他一些环境的人来说,这是非常有用的。 因为我们在谈论矩阵,所以我想我会加入它!

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

以下是创建二维数组和矩阵的其他一些方法(为了紧凑性而删除了输出):

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

Answer #10

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

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

将整个行存储在第一个列表中。 完成后,将列表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]]

Answer #11

我正在使用我的第一个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

Answer #12

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

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

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


Answer #13

通过使用列表:

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 :你需要处理散列表中的冲突


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

注意这个简短的表达,请参阅@FJ的答案中的完整解释





syntax-error