answer
846
Về mặt kỹ thuật bạn đang cố gắng lập chỉ mục một mảng chưa được khởi tạo. Trước tiên, bạn phải khởi tạo danh sách bên ngoài với danh sách trước khi thêm các mục; Python gọi đây là "danh sách hiểu".
# 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]]
Bây giờ bạn có thể thêm các mục vào danh sách:
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!
Mặc dù bạn có thể đặt tên chúng theo ý muốn, tôi nhìn vào nó theo cách này để tránh một số nhầm lẫn có thể xảy ra với việc lập chỉ mục, nếu bạn sử dụng "x" cho cả danh sách bên trong và bên ngoài và muốn có Ma trận không vuông.
846 hữu ích 5 bình luận chia sẻ
answer
353
Nếu bạn thực sự muốn một ma trận, bạn có thể sử dụng tốt hơn numpy
. Các phép toán ma trận numpy
thường sử dụng một kiểu mảng có hai chiều. Có nhiều
cách để tạo một mảng mới; một trong những hữu ích nhất là zeros
hàm, lấy tham số hình dạng và trả về một mảng của hình đã cho, với các giá trị được khởi tạo về 0:
>>> 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
cung cấp một matrix
loại là tốt. Nó ít được sử dụng hơn, và một số người khuyên không
nên sử dụng nó. Nhưng nó hữu ích cho những người đến numpy
từ Matlab, và trong một số bối cảnh khác. Tôi nghĩ tôi sẽ bao gồm nó vì chúng ta đang nói về ma trận!
>>> numpy.matrix[[[1, 2], [3, 4]]]
matrix[[[1, 2],
[3, 4]]]
Dưới đây là một số cách khác để tạo mảng và ma trận 2 chiều [với đầu ra được loại bỏ để thu gọn]:
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
353 hữu ích 5 bình luận chia sẻ
answer
292
Đây là một ký hiệu ngắn hơn để khởi tạo một danh sách các danh sách:
matrix = [[0]*5 for i in range[5]]
Thật không may, rút ngắn điều này thành một cái gì đó như 5*[5*[0]]
không thực sự hoạt động vì bạn
kết thúc với 5 bản sao của cùng một danh sách, vì vậy khi bạn sửa đổi một trong số chúng, tất cả đều thay đổi, ví dụ:
>>> 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]]
292 hữu ích 5 bình luận chia sẻ
answer
87
Nếu bạn muốn tạo một ma trận trống, cú pháp đúng là
matrix = [[]]
Và nếu bạn muốn tạo một ma trận có kích thước 5 được điền 0,
matrix = [[0 for i in xrange[5]] for i in xrange[5]]
87 hữu ích 3 bình luận chia sẻ
answer
71
Nếu tất cả những gì bạn muốn là một thùng chứa hai chiều để chứa một số yếu tố, bạn có thể sử dụng từ điển một cách thuận tiện:
Matrix = {}
Sau đó, bạn có thể làm:
Matrix[1,2] = 15
print Matrix[1,2]
Điều
này hoạt động vì 1,2
là một tuple và bạn đang sử dụng nó làm chìa khóa để lập chỉ mục từ điển. Kết quả tương tự như một ma trận thưa thớt.
Như được chỉ định bởi osa và Josap Valls, bạn cũng có thể sử dụng Matrix = collections.defaultdict[lambda:0]
để các phần tử bị thiếu có giá trị mặc định là 0
.
Vatsal nói thêm rằng phương pháp này có thể không hiệu quả lắm đối với các ma trận lớn và chỉ nên được sử dụng trong các phần không quan trọng về hiệu năng của mã.
71 hữu ích 5 bình luận chia sẻ
answer
37
Trong Python bạn sẽ tạo một danh sách các danh sách. Bạn không phải khai báo kích thước trước thời hạn, nhưng bạn có thể. Ví dụ:
matrix = []
matrix.append[[]]
matrix.append[[]]
matrix[0].append[2]
matrix[1].append[3]
Bây giờ ma trận [0] [0] == 2 và ma trận [1] [0] == 3. Bạn cũng có thể sử dụng cú pháp hiểu danh sách. Ví dụ này sử dụng nó hai lần để xây dựng "danh sách hai chiều":
from itertools import count, takewhile
matrix = [[i for i in takewhile[lambda j: j >> 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]]
Trong [5][5]
ví dụ
của bạn , bạn đang tạo một danh sách có số nguyên "5" bên trong và cố gắng truy cập mục thứ 5 của nó và điều đó làm tăng IndexError một cách tự nhiên vì không có mục thứ 5:
>>> l = [5]
>>> l[5]
Traceback [most recent call last]:
File "", line 1, in
IndexError: list index out of range
17 hữu ích 1 bình luận chia sẻ
answer
12
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]
Tại sao một mã dài như vậy, mà quá
Python
bạn hỏi?
Lâu rồi tôi không thấy thoải mái với Python, tôi đã thấy các câu trả lời một dòng để viết ma trận 2D và tự nhủ rằng tôi sẽ không sử dụng ma trận 2 chiều trong Python nữa. [Những dòng đơn đó khá đáng sợ và nó không cung cấp cho tôi bất kỳ thông tin nào về những gì Python đang làm. Cũng lưu ý rằng tôi không biết về những tốc ký này.]
Dù sao, đây là mã cho người mới bắt đầu đến từ nền tảng C, CPP và Java
Lưu ý cho những người yêu thích và các chuyên gia về Python: Xin đừng bỏ phiếu chỉ vì tôi đã viết một mã chi tiết.
12 hữu ích 0 bình luận chia sẻ
answer
10
Để khai báo một ma trận các số không [những cái]:
numpy.zeros[[x, y]]
ví dụ
>>> numpy.zeros[[3, 5]]
array[[[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]]]
hoặc numpy.ones [[x, y]] vd
>>> np.ones[[3, 5]]
array[[[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]]]
Thậm chí ba chiều là có thể. [ //www.astro.ufl.edu/~warner/prog/python.html xem -> mảng đa chiều]
10 hữu ích 0 bình luận chia sẻ
answer
9
Viết lại để dễ đọc:
# 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]
9 hữu ích 0 bình luận chia sẻ
answer
9
Tôi đang sử dụng tập lệnh Python đầu tiên của mình và tôi hơi bối rối với ví dụ ma trận vuông nên tôi hy vọng ví dụ dưới đây sẽ giúp bạn tiết kiệm thời gian:
# Creates a 2 x 5 matrix
Matrix = [[0 for y in xrange[5]] for x in xrange[2]]
vậy đó
Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
9 hữu ích 0 bình luận chia sẻ
answer
9
Sử dụng:
matrix = [[0]*5 for i in range[5]]
* 5 cho kích thước đầu tiên hoạt động vì ở cấp độ này, dữ liệu là bất biến.
9 hữu ích 1 bình luận chia sẻ
answer
7
Sử dụng NumPy, bạn có thể khởi tạo ma trận trống như thế này:
import numpy as np
mm = np.matrix[[]]
Và sau đó nối thêm dữ liệu như thế này:
mm = np.append[mm, [[1,2]], axis=1]
7 hữu ích 1 bình luận chia sẻ
answer
6
Tôi đọc các tệp được phân tách bằng dấu phẩy như thế này:
data=[]
for l in infile:
l = split[',']
data.append[l]
Danh sách "dữ liệu" sau đó là danh sách các danh sách có dữ liệu chỉ mục [hàng] [col]
6 hữu ích 0 bình luận chia sẻ
answer
6
Đây là cách tôi thường tạo các mảng 2D trong python.
col = 3
row = 4
array = [[0] * col for _ in range[row]]
Tôi thấy cú pháp này dễ nhớ so với việc sử dụng cho các vòng lặp trong việc hiểu danh sách.
6 hữu ích 0 bình luận chia sẻ
answer
4
Sử dụng:
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
Tôi nghĩ NumPy là con đường để đi. Trên đây là một cái chung nếu bạn không muốn sử dụng NumPy.
4 hữu ích 1 bình luận chia sẻ
answer
4
Nếu bạn muốn có thể nghĩ nó như một mảng 2D thay vì bị buộc phải suy nghĩ theo danh sách các danh sách [theo ý kiến của tôi tự nhiên hơn nhiều], bạn có thể làm như sau:
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros[[Nx,Ny]].tolist[]
Kết quả là một danh sách [không phải là mảng NumPy] và bạn có thể ghi đè lên các vị trí riêng lẻ bằng số, chuỗi, bất cứ thứ gì.
4 hữu ích 1 bình luận chia sẻ
answer
3
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5
Hãy cẩn thận về biểu thức ngắn này, xem phần giải thích đầy đủ trong câu trả lời của @ FJ
3 hữu ích 4 bình luận chia sẻ
answer
3
Đó là những gì từ điển được làm cho!
matrix = {}
Bạn có thể xác định khóa và giá trị theo hai cách:
matrix[0,0] = value
hoặc là
matrix = { [0,0] : value }
Kết quả:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
3 hữu ích 0 bình luận chia sẻ
answer
2
Nếu bạn không có thông tin kích thước trước khi bắt đầu thì hãy tạo hai danh sách một chiều.
danh sách 1: Để lưu trữ danh sách hàng 2: Ma trận hai chiều thực tế
Lưu trữ toàn bộ hàng trong danh sách 1. Sau khi hoàn thành, nối danh sách 1 vào danh sách 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
Đầu ra:
Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
2 hữu ích 0 bình luận chia sẻ
answer
2
bằng cách sử dụng danh sách:
matrix_in_python = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]
bằng cách sử dụng dict: bạn cũng có thể lưu trữ thông tin này trong bảng băm để tìm kiếm nhanh như
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]};
ma trận ['1'] sẽ cho bạn kết quả trong thời gian O [1]
* nb : bạn cần xử lý một vụ va chạm trong bảng băm
2 hữu ích 0 bình luận chia sẻ
answer
0
l=[[0]*[L] for i in range[W]]
Sẽ nhanh hơn:
l = [[0 for x in range[L]] for y in range[W]]
0 hữu ích 1 bình luận chia sẻ
answer
0
Thử đi:
rows = int[input['Enter rows\n']]
my_list = []
for i in range[rows]:
my_list.append[list[map[int, input[].split[]]]]
0 hữu ích 0 bình luận chia sẻ