2012-05-19 5 views
23

를 사용하여 3 차원 배열을 만듭니다.파이썬

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

을하지만 작동하지 않았다 : (n 개의 * n 개의 * n)도

내가 사용했습니다.

아이디어가 있으십니까? 고마워요!

EDIT : 나는 디퍼 풀 라이브러리 만 사용할 수 있으며, 곱하기의 방법 (예 : [[0] * n] * n)은 동일한 포인터에 연결되어 있기 때문에 작동하지 않습니다. 모든 값이 필요합니다. 개별

EDIT2 : 이미 아래 답변에 의해 해결되었습니다.

+0

표준'array' 모듈의'array' 클래스 사용을 고려하십시오. – martineau

답변

44

당신은 사용해야합니다 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 

하지만, 안쪽 목록은 copy-by-r이기 때문에 부작용이 있었을 것이다. 설 명 :

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

고마워,이 잘 작동하는 것. 나는 나의 프로그램에서 시험하고 결과로 곧 돌아올 것이다. –

5

올바른 방법, 왜 언급 @Adaman 참조 (당신이 (

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

) NxNxN에 같이 작성해야 할 노력하고 있지만이 정확하지 무엇

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

것).

+0

좋지 않습니다. 동일한 배열에 대한 참조를 포함합니다. 이것을 시도해보십시오 :'a = [[0] * 3] * 3; a [0] [0] = 1; a a print – Amadan

21

numpy.array들 다만,이 경우를 위해 설계된다

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

당신 제로 가득 차원 배열 I J K을 줄 것이다. 은 필요한 항목에 따라

에 따라 달라질 수 있습니다.

+0

고마워요. 이걸 시도해 볼게요. –

+0

아, 이건 비위생적 인 도서관 중 하나라고 생각 했어요. 나는 그 외에 다른 것을 사용할 수 없다. –

+1

아니요, 불행히도 외부 라이브러리입니다. 일반적으로 숫자 데이터 배열을 처리해야하는 경우 매우 적합합니다. 특히 속도가 문제인 경우. – mata

0

공백으로 초기화하는 모든 것을 고집하는 경우 내부 ([]] 대신 []로 복사 할 빈 목록이 1 개 포함 된 목록이므로 여분의 대괄호 세트가 필요합니다) "아무것도 포함하지 않는 목록을 복제하는"

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

그렇게하지 않거나 모두 동일한 참조를 가리 킵니다. 그냥 거리를 시도해보십시오. [1] [2] [0] .append (1)' –

+0

예, 제 문제는 제가 그 중 하나를 변경하면 모두 변경됩니다. 나는 그들에게 분리 된 요소가 필요하다. –

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

'col','row' 및'x' 설명에 감사드립니다! – 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 

다차원 배열에 대한 numpy.ndarray를 사용하는 것을 선호합니다.