파이썬에서 목록 꺼내기

7446 단어 파이썬목록numpy

introduction



경기 프로그래밍의 문제를 풀었을 때 사용한 방법에 대해 써 갑니다.
리스트의 임의의 부분을 꺼내는 처리에 대해 기술합니다.

잘못되어있는 곳이 있으면 코멘트 등 잘 부탁드립니다.

리스트의 대입 조작에 대해 이해가 달랐기 때문에, 수정했습니다. 리스트가 변수인 경우는 변수에 리스트 오브젝트의 주소치가 대입되고 있으므로, 대입을 실시할 때에는 리스트 오브젝트의 주소치를 건네주고 있다고 이해가 되지 않았습니다. 그 점을 주로 수정했습니다. 무례했습니다. (2020/05/26)

목록 준비



아래에서 임의의 2차원 리스트를 numpy를 사용하여 작성했습니다.
import numpy as np
array=np.arange(16).reshape((4,4)) #データを準備

>>>array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

리스트의 임의 부분을 꺼내는 처리



예를 들어 아래에 표시된 것과 같은 빨간색 원으로 둘러싸인 목록을 검색하려는 경우



파이썬으로 구현하면 다음과 같이 할 수 있다고 생각했습니다.

div_array=[]
for i in range(1,3):
    tep_array=[]
    for j in range(1,3):
        tep_array.append(array[i][j])
    div_array.append(tep_array)    
print(div_array)    

#div_array=[[5, 6], [9, 10]]

다만, 이 방법이라면 기술량도 많아, 변수를 많이 둘 필요가 있어 읽기 어렵습니다.
덧붙여 : array와 div_array가 나타내는 리스트 오브젝트는 다르고, 각 리스트내의 리스트의 주소치도 다르기 때문에, 어느 쪽의 리스트내를 변경했을 때에도 독립적으로 변경할 수 있습니다.

이 읽기 어려움을 해결하기 위해서, ndarray형 배열이면, 슬라이스를 이용하는 것으로 구현할 수 있습니다.
(단, python list에서 list [1 : 3, 1 : 3]을 지정하면 오류가 발생합니다.)
div_array=array[1:3,1:3]

>>>div_array([[ 5,  6],
       [ 9, 10]])

우선, 왼쪽의 1:3으로 행 방향을 취해,
[ 4, 5, 6, 7] 및 [ 8, 9, 10, 11] 행을 검색합니다.

그런 다음 오른쪽 1:3에서 열 방향을 검색할 수 있습니다.
따라서 [5,6]과 [9,10]을 꺼낼 수 있습니다.

다만, 이 경우 div_array내의 리스트의 주소와 array내의 리스트의 주소는 동일하므로, div_array내를 조작하면 array내의 리스트의 값도 변경해 버립니다. 그래서 div_array 안에 array 내의 리스트와 다른 새로운 리스트를 작성해, 그 오브젝트에 원래의 리스트의 값을 카피할 필요가 있습니다. 그 구현은
div_array=array[1:3,1:3].copy()

라고 기술하는 것으로 해결할 수 있습니다.

덧붙여 : list내 list를 print() 할 때의 콩 지식



이야기가 조금 벗어날 수 있지만 목록의 요소를 순서대로 출력 할 때
다음과 같이 하는 경우가 많다고 생각합니다.
for i in div_array:
    print(i)

#[5 6]
#[ 9 10]

다만 list의 [ ]가 표시되고 있으면 부정해가 되는 일도 있어, 이것을 막기 위해서 이하와 같이 구현을 시도했습니다.

인수의  end=""에 스페이스를 지정해, 5와 6 을 스페이스로 분할해 그 후의 하늘의 print()로 다음의 행에 옮겨 하려고 했습니다.
for i in div_array:
    for j in i:
        print(j ,end=" ")
    print()    

>>>5 6 #6、10の後にスペースが入っている
>>>9 10 #6、10の後にスペースが入っている

하지만, 이 구현에서는 6과 10의 후에도 스페이스가 들어 버려 부정해가 되었습니다.

이 문제를 해결하기 위해 다음과 같이 쉽게 해결할 수있었습니다.
[ ]를 제외하고 싶은 리스트의 앞에 *를 붙여 출력하는 것으로, 리스트내 리스트의 각 요소를 분할해 표시할 수 있었습니다.

for i in div_array:
    print(*i)

>>>5 6
>>>9 10

요약



이번에는 2차원 리스트로부터 임의의 리스트를 꺼내는 방법과 2차원 리스트의 출력에 관해서 말했습니다.
꽤 매니악한 내용입니다만 사용해 보세요.

좋은 웹페이지 즐겨찾기