>  기사  >  백엔드 개발  >  Stride 트릭을 사용하여 이동 평균 필터 구현을 향상시키는 방법은 무엇입니까?

Stride 트릭을 사용하여 이동 평균 필터 구현을 향상시키는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-19 10:02:30232검색

How to Enhance Moving Average Filter Implementation with Stride Tricks?

효율적인 이동 평균 필터 구현을 위한 스트라이드 트릭 사용

이 조사에서는 스트라이드 트릭을 사용하여 보다 효율적인 이동 평균 필터를 개발하는 방법을 탐구합니다. 이전 게시물에서 설명한 컨볼루션 기반 방법입니다. 목표는 scipy.ndimage.filters.convolve가 상대적으로 느린 작업에 대해 대규모 부동 소수점 배열을 필터링하는 것입니다.

초기 접근 방식에서는 스트라이드 트릭을 사용하여 상단, 중간 및 하단을 나타내는 일련의 배열을 생성했습니다. 3x3 필터 커널 행. 그런 다음 이러한 배열을 합산하고 평균하여 각 픽셀에 대한 필터 출력을 생성했습니다. 그러나 질문자는 전체 배열에 대한 커널 요소의 합계 또는 개별 값을 직접 얻을 수 있는 보다 효율적인 방법을 모색했습니다.

다차원 스트라이드 트릭을 사용한 향상된 접근 방식

향상된 솔루션에는 다차원 보폭 트릭을 적용하여 각 요소가 원하는 크기의 움직이는 창을 나타내는 원본 배열의 보기를 만드는 것이 포함됩니다. 이를 통해 마지막 축에 임의의 함수를 여러 번 적용하여 슬라이딩 창에서 이동 평균 또는 기타 원하는 통계 측정값을 효과적으로 계산할 수 있습니다.

코드 예

<code class="python">import numpy as np

def rolling_window(array, window):
    """Multidimensional moving window function"""
    # Validate window dimensions
    if not hasattr(window, '__iter__'):
        return rolling_window_lastaxis(array, window)
    for i, win in enumerate(window):
        if win > 1:
            array = array.swapaxes(i, -1)
            array = rolling_window_lastaxis(array, win)
            array = array.swapaxes(-2, i)
    return array

filtsize = (3, 3)
array = np.arange(100).reshape((10, 10))
windowed_array = rolling_window(array, filtsize)
blurred_array = windowed_array.mean(axis=-1).mean(axis=-1)</code>

향상된 솔루션의 장점

  • 스트라이드 트릭을 사용하여 이동 창을 직접 생성하므로 중간 단계가 필요 없습니다.
  • 다차원 배열에 적용 가능, 여러 축을 따라 효율적인 필터링을 수행합니다.
  • 이동 창 작업을 벡터화하여 계산 시간을 크게 줄입니다.

제한 사항

이에도 불구하고 장점으로는 다차원 이동 창에 보폭 트릭을 사용하면 메모리 사용량이 증가할 수 있다는 점에 유의하는 것이 중요합니다. 따라서 사용 가능한 리소스와 입력 배열의 크기를 신중하게 고려해야 합니다.

scipy.ndimage와의 비교

스트라이드 트릭은 유연성과 벡터화 이점을 제공하지만 , scipy.ndimage 함수는 일반적으로 메모리 효율성이 더 높으며 다차원 이미지 처리 작업에 최적화되어 있습니다. 대규모 배열의 경우 이동 평균 필터를 적용하기 위한 더 빠르고 강력한 옵션으로 scipy.ndimage.uniform_filter를 권장합니다.

위 내용은 Stride 트릭을 사용하여 이동 평균 필터 구현을 향상시키는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.