2012-05-19 40 views
23

Tôi muốn tạo ra một mảng 3D bằng Python (2,7) để sử dụng như thế này:Tạo mảng 3D sử dụng Python

distance[i][j][k] 

Và các kích thước của mảng cần được kích thước của một biến tôi có. (N * n * n)

tôi đã cố gắng sử dụng:

distance = [[[]*n]*n] 

nhưng điều đó dường như không làm việc.

Bất kỳ ý tưởng nào? Cảm ơn rất nhiều!

CHỈNH SỬA: Tôi chỉ có thể sử dụng các thư viện bị điếc và phương thức nhân (tức là [[0] * n] * n) sẽ không hoạt động vì chúng được liên kết với cùng một con trỏ và tôi cần tất cả các giá trị cá nhân

EDIT2: Đã được giải quyết bằng câu trả lời bên dưới.

+0

Xem xét sử dụng lớp 'mảng' của mô-đun' mảng' chuẩn. – martineau

Trả lời

44

bạn nên sử dụng một list comprehension:

>>> import pprint 
>>> n = 3 
>>> distance = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)] 
>>> pprint.pprint(distance) 
[[[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]]] 
>>> distance[0][1] 
[0, 0, 0] 
>>> distance[0][1][2] 
0 

bạn có thể tạo ra một cấu trúc dữ liệu với một tuyên bố rằng trông giống như một trong những bạn đã cố gắng, nhưng nó sẽ có tác dụng phụ vì danh sách bên trong là bản sao-by-r eference:

>>> distance=[[[0]*n]*n]*n 
>>> pprint.pprint(distance) 
[[[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]]] 
>>> distance[0][0][0] = 1 
>>> pprint.pprint(distance) 
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 
+0

Cảm ơn, điều này dường như hoạt động tốt. Tôi sẽ kiểm tra trong chương trình của mình và quay lại sớm với kết quả. –

5

Cách đúng sẽ

[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)] 

(Những gì bạn đang cố gắng để làm nên được viết tương tự (ví NxNxN)

[[[0]*n]*n]*n 

nhưng đó không phải là chính xác, xem @Adaman bình luận tại sao).

+0

Không tốt. Nó sẽ chứa các tham chiếu đến cùng một mảng. Hãy thử điều này: 'a = [[0] * 3] * 3; a [0] [0] = 1; in a' – Amadan

21

numpy.array s được thiết kế chỉ dành riêng cho trường hợp này:

numpy.zeros((i,j,k)) 

sẽ cung cấp cho bạn một loạt các kích thước i j k, đầy zero.

tùy thuộc vào những gì bạn cần, numpy có thể là thư viện phù hợp với nhu cầu của bạn.

+0

Cảm ơn, tôi sẽ thử điều này –

+0

Ồ, tôi nghĩ đây là một trong những thư viện điếc. Tôi không thể sử dụng bất cứ điều gì khác hơn thế. –

+1

không, thật không may đó là một thư viện bên ngoài. nhưng thường rất phù hợp nếu bạn cần xử lý các mảng dữ liệu số lớn. Đặc biệt nếu tốc độ là một vấn đề. – mata

0

Nếu bạn nhấn mạnh mọi thứ khởi tạo trống, bạn cần thêm một dấu ngoặc ở bên trong ([[]] thay vì [], vì đây là "danh sách chứa 1 danh sách trống cần được nhân đôi" "một danh sách có chứa gì để lặp lại"):

distance=[[[[]]*n]*n]*n 
+1

Đừng làm điều đó, hoặc tất cả chúng sẽ trỏ đến cùng một tham chiếu! Chỉ cần thử 'khoảng cách [1] [2] [0] .append (1)' –

+0

Vâng, vấn đề của tôi với điều đó là nếu tôi thay đổi một trong số họ, nó sẽ thay đổi tất cả chúng. Tôi cần chúng là các yếu tố riêng biệt. –

2
d3 = [[[0 for col in range(4)]for row in range(4)] for x in range(6)] 

d3[1][2][1] = 144 

d3[4][3][0] = 3.12 

for x in range(len(d3)): 
    print d3[x] 



[[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, 144, 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], [3.12, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
+0

Cảm ơn 'col',' row' và 'x' làm rõ! – Gluttton

0
def n_arr(n, default=0, size=1): 
    if n is 0: 
     return default 

    return [n_arr(n-1, default, size) for _ in range(size)] 

arr = n_arr(3, 42, 3) 
assert arr[2][2][2], 42 
3
""" 
Create 3D array for given dimensions - (x, y, z) 

@author: Naimish Agarwal 
""" 


def three_d_array(value, *dim): 
    """ 
    Create 3D-array 
    :param dim: a tuple of dimensions - (x, y, z) 
    :param value: value with which 3D-array is to be filled 
    :return: 3D-array 
    """ 

    return [[[value for _ in xrange(dim[2])] for _ in xrange(dim[1])] for _ in xrange(dim[0])] 

if __name__ == "__main__": 
    array = three_d_array(False, *(2, 3, 1)) 
    x = len(array) 
    y = len(array[0]) 
    z = len(array[0][0]) 
    print x, y, z 

    array[0][0][0] = True 
    array[1][1][0] = True 

    print array 

thích sử dụng numpy.ndarray cho mảng đa chiều.

Các vấn đề liên quan