2010-01-31 73 views
6

Tôi biết bạn có thể tạo danh sách dễ dàng lồng trong python như thế này:Làm thế nào để tạo danh sách lồng nhau trong python?

[[1,2],[3,4]] 

Nhưng làm thế nào để tạo ra một ma trận 3x3x3 của zero?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)] 

hoặc

[[[0]*3]*3]*3 

Có vẻ không đúng. Không có cách nào để tạo ra nó chỉ cần truyền danh sách các thứ nguyên cho một phương thức? Ví dụ:

CreateArray([3,3,3]) 

Trả lời

9

Trong trường hợp một ma trận thực sự là những gì bạn đang tìm kiếm, hãy xem xét gói gọn gàng.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

này sẽ cung cấp cho bạn một mảng 3x3x3 các zeros:

numpy.zeros((3,3,3)) 

Bạn cũng được hưởng lợi từ các tính năng tiện lợi của một mô-đun được xây dựng cho tính toán khoa học.

+0

Điều này không hoạt động. Nó nên được numpy.zeros ((3, 3, 3)) –

+0

@Cytokine sửa chữa –

+0

Hah, tôi thề tuple đã có khi tôi gõ nó ...Cảm ơn Jader! –

-3

Chỉ cần tổ cú pháp nhân:

[[[0] * 3] * 3] * 3 

Đó là do đơn giản để thể hiện hoạt động này sử dụng folds

def zeros(dimensions): 
    return reduce(lambda x, d: [x] * d, [0] + dimensions) 

Hoặc nếu bạn muốn tránh sao chép tài liệu tham khảo, vì vậy thay đổi một mục sẽ không ảnh hưởng đến bất kỳ mục nào khác mà bạn nên sử dụng bản sao thay thế:

import copy 
def zeros(dimensions): 
    item = 0 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
+1

hãy cho phép chỉnh sửa của tôi –

+0

@Jader Dias: Amen – Dario

+0

hiện đang sử dụng bản đồ !! –

1

NumPy giải quyết vấn đề này

http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

>>> a = array([2,3,4]) 
>>> a 
array([2, 3, 4]) 
>>> type(a) 
<type 'numpy.ndarray'> 

Nhưng nếu bạn muốn sử dụng danh sách có nguồn gốc Python như một ma trận các phương pháp helper sau đây có thể trở thành có ích:

import copy 

def Create(dimensions, item): 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
def Get(matrix, position): 
    for index in position: 
     matrix = matrix[index] 
    return matrix 
def Set(matrix, position, value): 
    for index in position[:-1]: 
     matrix = matrix[index] 
    matrix[position[-1]] = value 
1

Việc hiểu danh sách chỉ là đường cú pháp để thêm tính biểu cảm vào danh sách khởi tạo; trong trường hợp của bạn, tôi sẽ không sử dụng chúng ở tất cả, và đi cho một vòng lặp lồng nhau đơn giản.

Ở cấp độ hoàn toàn khác: bạn có nghĩ rằng số n-dimensional array của NumPy có thể là cách tiếp cận tốt hơn không?
Mặc dù bạn có thể sử dụng danh sách để triển khai ma trận đa chiều, tôi nghĩ rằng đó không phải là công cụ tốt nhất cho mục tiêu đó.

0

Hoặc sử dụng chức năng tổ định nghĩa here, kết hợp với (0) lặp lại từ các mô-đun itertools:

nest(itertools.repeat(0),[3,3,3]) 
Các vấn đề liên quan