2012-10-31 32 views
18

Không có loại mảng nào trong python, nhưng để mô phỏng nó, chúng ta có thể sử dụng danh sách. Tôi muốn có cấu trúc 2d giống như mảng với số không. Câu hỏi của tôi là: là những gì khác biệt, nếu có, trong hai biểu thức này:2d mảng số không

zeros = [[0 for i in xrange(M)] for j in xrange(M)] 

zeros = [[0]*M]*N 

sẽ zeros có giống nhau không? cái nào tốt hơn để sử dụng bằng tốc độ và khả năng đọc?

Trả lời

28

Bạn nên sử dụng numpy.zeros. Nếu đó không phải là một lựa chọn, bạn muốn phiên bản đầu tiên. Trong phiên bản thứ hai, nếu bạn thay đổi một giá trị, nó sẽ được thay đổi ở nơi khác trong danh sách - ví dụ:

>>> a = [[0]*10]*10 
>>> a 
[[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, 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], [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, 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]] 
>>> a[0][0] = 1 
>>> a 
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

Điều này là do (khi bạn đọc biểu thức từ trong ra ngoài), bạn tạo danh sách 10 số không. Sau đó, bạn tạo danh sách gồm 10 tham chiếu đến danh sách ban đầu gồm 10 số không.


Lưu ý rằng:

zeros = [ [0]*M for _ in xrange(N) ] 

cũng sẽ làm việc và nó tránh được danh sách hiểu lồng nhau. Nếu numpy không có trong bảng, đây là biểu mẫu tôi sẽ sử dụng.

+0

Là nó thực sự cần thiết để sử dụng NumPy chỉ đơn giản cho rằng tính năng duy nhất? +1 cho phiên bản đầu tiên. – John

+1

@johnthexiii - Có thể không. Nhưng, nếu OP muốn một mảng 2d của số không, tôi sẽ sẵn sàng để đi ra ngoài trên một chi và nói rằng mã OP có thể có thể hưởng lợi từ gumpy ở những nơi khác là tốt. – mgilson

+0

tôi sẽ không cài đặt numpy cho chỉ zeroing danh sách;) Cảm ơn bạn đã giải thích sau, đó là những gì tôi đang tìm kiếm. – yakxxx

2

Trong trường hợp thứ hai, bạn tạo danh sách tham chiếu đến cùng một danh sách. Nếu bạn có mã như sau: [lst] * N trong đó lst là tham chiếu đến danh sách, bạn sẽ có danh sách sau: [lst, lst, lst, lst, ..., lst]. Nhưng vì danh sách kết quả chứa tham chiếu đến cùng một đối tượng, nếu bạn thay đổi giá trị trong một hàng, nó sẽ được thay đổi trong tất cả các hàng khác.

7

cho Python 3 (không xrange hơn), câu trả lời thích

zeros = [ [0] * N for _ in range(M)] 

cho mảng N M x các zeros