https://mellowlee.tistory.com/entry/numpy-npisin-npwhere-index-%EC%B0%BE%EC%95%84%EB%B3%B4%EA%B8%B0
https://blog.naver.com/PostView.nhn?blogId=song_gina&logNo=221763499607
numpy로 행렬을 다룰 때 특정 값의 위치를 얻고 싶어서 검색해보고 where을 찾아냈다.
numpy의 array로 리스트의 리스트를 행렬처럼 만들어서 matrix에 담아줬다.
matrix.where(1)로 값이 1인 요소의 위치를 얻으려고 했는데 0부터 시작해서 3행 2열에 있는 1은 그냥 3이라고 답해줬다.
아, 그냥 print(matrix.where(1))을 하면 여러 값들이 다 나온다. matrix.where(1)[0]을 프린트해야 숫자값만 나온다.
3행 2열, 3행 3열에 이렇게 1이 2개 있을 때는 [3, 3]이라고 나왔다.
6 x 6 전체에 1이 있을 때는 [0 0 0 0 0 0 1 1 1 1 1 1 ... 5 5 5 5 5 5] 이렇게 나왔다.
결과적으로 다른 방법을 찾아보기로 했다.
내가 원하는건 아니었지만 where(조건, 참일 때 값, 거짓일 때 값) 이렇게 사용해서 행렬을 바꿀 때 쓰면 유용할 것 같다.
https://yngie-c.github.io/numpy/2021/03/02/numpy_indexing_slicing/
슬라이싱으로 한꺼번에 1 주변 값들을 바꾸려고 했는데 주변 값들이 바뀌면서 다음 동작을 실행할 때 영향이 가서 원하는대로 동작이 되지 않았다.
지금 다시 생각해보니 1의 인덱스를 찾아서 담아두는 동작과 슬라이싱으로 값을 바꾸는 동작을 따로 만들었었다면 이걸 응용해서 더 쉽게 풀 수 있었을 것 같다.
https://runebook.dev/ko/docs/numpy/reference/generated/numpy.count_nonzero
0, 1과 구분하기 위해서 2로 위험지대를 바꿔주고 안전지대는 전체-nonzero로 구했다.
if문을 8개 써서 풀고 제출한 후 다른 사람의 풀이를 보니 중복을 제거할 수 있는 set()을 이용해서 이미 위험지대가 된 좌표를 중복되지 않게 만드는 풀이가 있었다.
min과 max를 이용해서 행렬의 범위를 벗어나지 않도록 제한한 풀이도 있었다.
'TIL' 카테고리의 다른 글
TIL 071423 (0) | 2023.07.14 |
---|---|
TIL 071323 (0) | 2023.07.13 |
TIL 071123 (0) | 2023.07.13 |
TIL 071023 (0) | 2023.07.11 |
TIL 070723 (0) | 2023.07.07 |