3중배열을 출력을 위해 3중포문을 사용하고 싶습니다.

조회수 2212회

3차원 영상을 입력받아 For문을 이용해 출력을 하려고합니다.

하지만 python은 시작한지 얼마 되지 않아 어떻게 구현하는지 헷갈리네요.

원래는 영상의 헤더값에 colmun과 row값이 포함되어 있어야하는데 사용하는 영상들이 이 값들이 없어서 다른방법으로 이 값들을 획득해야합니다.

현재사용하고 있는 영상의 크기는 x축 500, y축 500, z축 500만큼의 길이를 가지고 있습니다.

x=500, y=500, z=500, Array[x][y][z]

하지만 모든 영상이 이 와 같은 길이를 가지는것은 아니기 때문에 포문에 저 값들을 넣어서 사용할수 없습니다. 현재 작성한 포문은 다음과 같습니다. 첫번째 포문에는 data[x]의 길이만큼, 두번째 포문은 data[y]의 길이만큼, 세번째 포문은 data[z] 길이만큼의 포문을 돌리고 싶습니다. 장황하게 설명한것 같네요 쉽게말하자면 3차원 배열의 인자로 들어가는 x,y,z의 최대길이를 구하고싶습니다. 어떻게 해야 할까요?? 많은 도움 부탁드립니다.

for x in range(0, 500):
    for y in range(100, 500):
        for z in range(220, 300):
            if data[x][y][z] != 0:
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 파이썬의 리스트는 길이를 알려줄 수 있습니다.

    a = [ 1, 2, 3, 4, 5 ]
    len(a)  # => 5
    

    그리고, Array가 3차원 배열이라면, 길이를 몰라도 루프를 순회할 수 있습니다. 다음과 같습니다.

    for data_x in Array:        # Array 는 3차원 리스트
        for data_xy in data_x: # data_x 는 2차원 리스트
            for data_xyz in data_xy: # data_xy 는 1차원 리스트
                 if data_xyz != 0:
                    # do what you want
    

    만약 인덱스가 필요한 것이라면, enumerate 를 같이 쓰면 됩니다.

    for i, d in enumerate(lst):
        print(d, '는 리스트의', i, '번째 원소)
    
    • 말씀하신 루프를 사용했는데 MemoryError라고 뜨네요...ㅠㅠ 해결방법이 있을까요 알 수 없는 사용자 2019.6.24 08:44
    • 코드가 전혀 달라요. 잘 읽어보세요. nowp 2019.6.24 10:43
    • for data[x] in data: for data[x]]y] in data[x]: for data[x][y][z] in data[x][y]: if data[x][y][z] 알 수 없는 사용자 2019.6.24 11:06
    • 이게 맞을까요?! 알 수 없는 사용자 2019.6.24 11:06
    • 파이썬 기초 부분을 문법을 조금 찬찬히 공부하시는 게 어떨까요? 뭔가 마음만 급하셔서, 정확하게 원하는 걸 하는데 필요한 걸 질문하지 못하고 있는 듯한 느낌입니다. / 기초문법을 이미 배우셨다면, 뭔가 착각에 빠져서 이해를 못하고 있는 것 같고요. nowp 2019.6.24 12:47
  • for x in data:
        for y in x:
            for z in y:
                if data[x][y][z] != 0:
    

    말씀하신 부분을 반영해서 이와 같이 코드를 작성했습니다. MemoryError라고 출력되네요.

    for x in range(0, 500):
        for y in range(0, 500):
            for z in range(0,500):
                if data[x][y][z] != 0:
    

    range의 원소를 배열의 min, max로 설정했을때는 따로 에러가 출력되지 않습니다. 해결방법이 있을까요?

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 영상 데이터를 한 번에 다 메모리에 올리는게 문제일 것 같은데요... 대충 위의 질문 상황을 고려하여 생각해 보면, 500 * 400 * 80 크기에 각 데이터가 단순히 rgb의 0~255 값을 가지고, uint8이니 8 * 3 = 24 바이트라고 가정하면 메모리에 올라간게 360MB 정도 될건데 이후 코드 이터레이션을 돌 때 확보하는 자료 구조들의 메모리까지 생각하면 코드 실행 과정에서 메모리 초과가 발생할 가능성이 높습니다. 색상 표현에 더 많은 바이트를 쓰거나 full 배열 영상을 쓰면 용량이 더 올라갈거고요. 애초에 필요한 만큼만 파일에서 받아서 쓰는 형태(스트림 구조)로 처리하지 않으면 계속 메모리 문제를 피할 수 없어 보이는데요. 하드웨어 메모리 스펙을 올리는 것도 한계가 명확하고요. doodoji 2019.6.27 18:15

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)