이미지마다 각 열의 최대 값이 이미지의 가운데에 세로로 표시되도록 각 열을 오프셋하고 싶은 이미지가 있습니다.이미지 열을 최대 값으로 정렬
unaligned = np.array([[0,0,1,2,3,2,1,0,0,0],
[0,0,0,1,2,3,2,1,0,0],
[0,1,2,3,4,3,2,1,0,0],
[0,0,1,2,3,2,1,0,0,0],
[0,0,0,1,2,3,2,1,0,0]]).T
일단 정렬, 그것은 내가 열을 기준으로 열을 이동 최대 값의 인덱스를 찾을 수
aligned = np.array([[0,0,0,1,2,3,2,1,0,0],
[0,0,0,1,2,3,2,1,0,0],
[0,0,1,2,3,4,3,2,1,0],
[0,0,0,1,2,3,2,1,0,0],
[0,0,0,1,2,3,2,1,0,0]]).T
과 같아야합니다 : 여기에 몇 가지 장난감 데이터입니다 그런 다음 중간 값에서 최대 값을 갖는 새로운 배열로 열을 다시 작성하십시오. 그러나 이것을 수행하는 간결하고 빠른 방법이 있습니까? 특히 수천 개의 열이있는 이미지가있는 경우? 아마도 열 최대 값을 제어 포인트로 사용하는 일부 이미지 처리 루틴일까요?
감사합니다. 우리는 다른 방법과 같이, clipping
와 row_idx
를 얻을 수 있습니다, 당신은 제로 포지션으로 이동하고 열의 끝이 제로가 채우기 위해 시도하는 경우
m,n = unaligned.shape
col_shifts = m//2 - unaligned.argmax(0)
row_idx = np.mod(np.arange(m)[:,None]-col_shifts,m)
aligned_out = unaligned[row_idx,np.arange(n)]
- -
'np.array'에 중첩 호출을 할 필요가 없습니다. np.array ([[0,1, ...], [...], [...]])'와 같은 중첩 목록은 정상적으로 작동합니다. –
적어도 하나의 연산으로 최대 값을 벡터화 할 수 있습니다. 각 열마다 다른 시프트가 필요하므로 루프를 사용해야 할 수도 있습니다. –