2014-04-13 2 views
1

부울 numpy 배열에 몇 가지 기본 클러스터링을 찾고 기본적으로 마스크를 사용하여 2 차원 평균화를 시도하고 있지만 실제로보다 나은 솔루션이 있어야합니다.numpy 어레이 마스크 평균

def grab_window(location, array, window=(3,3)): 
    minimums = [min(0, i-a) for i, a in zip(location, window)] 
    maximums = [(i + a) for i, a in zip(location, window)] 
    answer = array 
    for i, _ in enumerate(location): 
     answer = answer[slice(minimums[i],maximums[i])] 
    return answer 

을 그리고 나는 기본적으로 단지 커널에 의해 각각의 창을 곱한 수정 된 윈도우의 평균을 반환, 원래의 배열을 반복 :이 느리고 우아 이후 ', 도착했습니다.

필터 나 비슷한 효과가있는 것 같지만 지금까지 찾을 수 없었습니다.

편집 : 위치는 창과 비슷한 형태의 tuple입니다. 우리는 내가이 라인을 따라 뭔가를 찾고있을 것 균일 한 겹 마스크, 이것의 간단한 버전을 수행하는 경우 예를 들어

는 :

import numpy as np 
test = np.arange(0,24).reshape(6, 4) 
footprint = [ 
[1,1,1], 
[1,0,1], 
[1,1,1] 
] 
some_function(test, footprint) 
array([[ 1, 2, 3, 4], 
    [ 4, 5, 6, 6], 
    [ 8, 9, 10, 10], 
    [12, 13, 14, 14], 
    [16, 17, 18, 18], 
    [18, 19, 20, 21]]) 
+0

은 우리에게 location''의 샘플을 제공합니다. – emeth

+1

죄송합니다,'array' 제발. – emeth

+0

은'location' 튜플이고'window'는 항상 쌍을 이루고 있습니까? – TooTone

답변

1

완전히 기능을 가지고 scipy 밝혀 그 이미 이것을합니다. How to apply ndimage.generic_filter()

예에서 언급 한 바와 같이 generic_filter 실제로는 훨씬 더 안정적인 방법으로 정확히이 일을합니다 :

def some_avg(values): 
    return values.mean() 

footprint = np.array([ 
    [1,1,1], 
    [1,0,1], 
    [1,1,1] 
]) 

test = test = np.arange(0,24).reshape(6, 4) 

scipy.ndimage.filters.generic_filter(test, some_avg, footprint=footprint) 

array([[ 1, 2, 3, 4], 
    [ 4, 5, 6, 6], 
    [ 8, 9, 10, 10], 
    [12, 13, 14, 14], 
    [16, 17, 18, 18], 
    [18, 19, 20, 21]]) 
관련 문제