2013-09-06 2 views
20

나는 기본적인 2-D numpy 배열을 가지고 있으며 좀 더 거친 해상도로 "다운 샘플링"하고 싶습니다. 쉽게 이것을 할 수있는 간단한 numpy 또는 scipy 모듈이 있습니까? 이 배열은 Basemap 모듈을 통해 지리적으로 표시됩니다.파이썬에서의 다운 샘플 배열

예제 : enter image description here

답변

3

imresize과 같은 ndimage.interpolation.zoom 보면 그들은 당신이

내가 여기 imresize 전에 시도했지만하지 않은 내가 ndimage.interpolation.zoom

a = np.array(64).reshape(8,8) 
a = ndimage.interpolation.zoom(a,.5) #decimate resolution 
를 사용한 방법입니다 원하는 것을 할

a는 그 안에 보간 값이있는 4x4 행렬입니다.

+0

의 요인에 의해 감소시키기 위해 여러 번 적용될 수있다하면 코드이며) colbar = m.colorbar frefcobj = m.pcolormesh (x, y, findiff, 음영 = '평면', vmin = -15, vmax = 15, cmap = cmap, size = "4 %", pad = "5 %", extend = 'both', ticks = intervals)' diff는 699x699 배열입니다. 작업을 수행하지 않는 것 같습니다. – wuffwuff

+0

이전에 imresize를 시도하지 않았지만 확대/축소를 사용하여 스 니펫을 추가했습니다. 그것은 당신이 찾고있는 것이 아닙니까?나는 그것을 포함하지 않는 것으로 보이는 이전 버전의 scipy를 가지고 있기 때문에 현재 imresize를 테스트 할 수 없습니다. – Hammer

+0

흥미 롭습니다. 내가 찾고있는 것처럼 '리 샘플링'하지 않는 것 같습니다. 대신 diff 배열을 가져 와서베이스 맵 창에 여러 번 그려 넣었습니다. 나는 일종의 응집체 또는 용해 기술이 필요할 것이라고 생각합니다. 지금까지 의견을 보내 주셔서 감사합니다. – wuffwuff

1

T 그 사람이 당신이 찾고있는 사람이 아닐지도 모르겠다.

libsamplerate 용 Python wrapper 인 scikits.samplerate (docs)을 설치해보십시오. 고품질의 리샘플링 알고리즘을 제공합니다. 그러나 내가 알 수있는 한, 1D에서만 작동합니다. 한 축을 따라 2D 신호를 리샘플링하고 다른 축을 따라 2D 신호를 리샘플링 할 수는 있지만 고품질 리샘플링의 이점을 방해 할 수 있다고 생각합니다.

+1

예,이 상황에서는 작동하지 않지만 입력 해 주셔서 감사합니다. 나는 공간적으로 집합 할 수있는 무언가가 필요하다. – wuffwuff

9

다운 샘플링 할 때 보간법이 잘못되었습니다. 항상 집계 된 접근 방식을 사용하십시오.

"요인"을 사용하여 해상도를 줄이는 방법으로 블록 방법을 사용합니다.

import numpy as np 
from scipy import ndimage 

def block_mean(ar, fact): 
    assert isinstance(fact, int), type(fact) 
    sx, sy = ar.shape 
    X, Y = np.ogrid[0:sx, 0:sy] 
    regions = sy/fact * (X/fact) + Y/fact 
    res = ndimage.mean(ar, labels=regions, index=np.arange(regions.max() + 1)) 
    res.shape = (sx/fact, sy/fact) 
    return res 

예 5 (5 × 블록)의 계수를 사용하여 (100, 200) 형상으로 배열 A (20, 40) 배열 결과 결과 :

ar = np.random.rand(20000).reshape((100, 200)) 
block_mean(ar, 5).shape # (20, 40) 
+1

고마워요, 마이크. 나는 당신의 해결책이 내가 찾는 것을 더 많이 생각한다고 생각합니다. 코드를 적용 할 때 배열 크기가 일치하지 않아 오류가 발생합니다 : 'file "diffplot.py", 38 행, block_mean res.shape = (sx/fact, sy/fact) ValueError : 전체 크기 새로운 배열은 변경되지 않아야합니다. ' – wuffwuff

+0

위의 문제는 인자가 원래 배열 모양으로 똑같이 나눌 필요가 있기 때문입니다. 그러나이 함수는 여전히 부적절한 결과를 제공합니다. 흥미 롭 군. 내가 찾고있는 것처럼 '리 샘플링'하지 않는 것 같습니다. 대신 diff 배열을 가져 와서베이스 맵 창에 여러 번 그려 넣었습니다. 나는 일종의 응집체 또는 용해 기술이 필요할 것이라고 생각합니다. 지금까지 의견을 보내 주셔서 감사합니다. – wuffwuff

+0

안녕하세요 마이크, 왜 보간법이 왜 다운 샘플링에 나쁜 방법인지 설명해 주시겠습니까? 보간법이 좋지 않다면 이미지 크기가 원하는 블록 크기로 나눌 수없는 경우를 다루는 훌륭한 방법이 있을까요? –

11

scikit-image 작업 버전을 시행했다

http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce

: 내가 제대로 이해한다면 여기 downsampling의,하지만 그들은 그것이 DSP의 측면에서 다운 샘플링되지 않는 것이 downsampling를 호출 부끄러워

하지만 매우 잘 작동하며 이미지에서 np.nan을 처리 할 수있는 것은 파이썬에서 찾은 유일한 downsampler입니다. 나는 이걸로 거대한 이미지를 아주 빨리 다운 샘플링했다.

1

OP는 단지 courser 해상도를 원하기 때문에 각 차원에서 픽셀 수를 절반으로 줄이는 방법을 공유 할 것이라고 생각했습니다. 나는 2x2 블록의 평균을 취한다. `findiff = scipy.misc.imresize (DIFF, 30 = "선형"보정시, 모드 = 없음 : 이것은 다음 2

from scipy.ndimage import covolve 
array_downsampled = convolve(array, np.array([[0.25,0.25],[0.25,0.25]]))[:array.shape[0]:2,:array.shape[1]:2]