2013-09-06 20 views
20

Mam podstawowe tablice numdy 2-D i chciałbym "obniżyć" je do bardziej rozdzielczej rozdzielczości. Czy istnieje prosty moduł numpy lub scipy, który może to łatwo zrobić? Należy również zauważyć, że tablica ta jest wyświetlana geograficznie za pośrednictwem modułów Basemap.Tablica upustów w Pythonie

SAMPLE: enter image description here

Odpowiedz

3

imresize i ndimage.interpolation.zoom wyglądają tak, jakby to, co chcesz

nie próbowałem imresize wcześniej, ale tutaj jest jak Użyłem ndimage.interpolation.zoom

a = np.array(64).reshape(8,8) 
a = ndimage.interpolation.zoom(a,.5) #decimate resolution 

a jest to macierz 4x4 z interpolowanymi wartościami

+0

o to fragment kodu: 'findiff = scipy.misc.imresize (edycja, 30, interp = 'dwuliniowo', tryb = None) frefcobj = m.pcolormesh (x, y, findiff, cieniowanie = "płaskie", vmin = -15, vmax = 15, cmap = cmap, zorder = 1) colbar = m.colorbar (frefcobj, "bottom", size = "4%", pad = "5%", extend = 'both', ticks = intervals) ' diff to macierz 699x699. Wydaje się, że nie spełnia on tego zadania. – wuffwuff

+0

Nigdy wcześniej nie próbowałem imresize, ale dodałem fragment za pomocą zoomu. Czy tego nie szukasz?W tej chwili nie mogę przetestować imresize, ponieważ mam starszą wersję scipy, która nie zawiera go. – Hammer

+0

Interesujące. Wydaje się, że nie jest to "ponowne próbkowanie", tak jak tego, czego szukam. Zamiast tego wziął tablicę diff i wydrukował ją wiele razy w oknie mapy bazowej. Myślę, że potrzebuję jakiejś agregacji lub techniki rozpuszczania. Dzięki za twój wkład do tej pory. – wuffwuff

1

T jego może nie jest to, czego szukasz, ale myślałem, że wspomnę o tym dla kompletności.

Możesz spróbować zainstalować scikits.samplerate (docs), który jest opakowaniem Pythona dla libsamplerate. Zapewnia ładne, wysokiej jakości algorytmy resamplingu - ALE o ile mogę powiedzieć, działa tylko w 1D. Być może będziesz w stanie ponownie próbkować swój sygnał 2D wzdłuż jednej osi, a następnie wzdłuż drugiej, ale myślę, że może to przeciwdziałać korzyściom z wysokiej jakości resamplingu.

+1

Tak, to nie zadziała w tej sytuacji, ale dziękuję za dane wejściowe. Potrzebuję czegoś, co może zagregować przestrzennie. – wuffwuff

9

Podczas zmniejszania próbkowania interpolacja jest niewłaściwa. Zawsze używaj podejścia zbiorczego.

Używam środków blokowych, aby to zrobić, używając "współczynnika", aby zmniejszyć rozdzielczość.

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 

przykład, A (100, 200) tablicę kształt stosując 5-krotnie (bloków 5x5) daje w wyniku (20, 40) tablicy:

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

Dzięki, Mike. Myślę, że twoje rozwiązanie jest bardziej tego, czego szukam. Podczas stosowania kodu otrzymuję komunikat o błędzie z powodu niezgodności rozmiaru tablicy: 'Plik" diffplot.py ", wiersz 38, w bloku_mean res.shape = (sx/fact, sy/fact) ValueError: całkowity rozmiar nowej tablicy musi pozostać niezmieniona. " – wuffwuff

+0

Powyższy problem wynikał z konieczności równomiernego podziału współczynnika na oryginalny kształt tablicy. Jednak ta funkcja nadal zapewnia niewłaściwe wyniki. Ciekawy. Wydaje się, że nie jest to "ponowne próbkowanie", tak jak tego, czego szukam. Zamiast tego wziął tablicę diff i wydrukował ją wiele razy w oknie mapy bazowej. Myślę, że potrzebuję jakiejś agregacji lub techniki rozpuszczania. Dzięki za twój wkład do tej pory. – wuffwuff

+0

Witaj, Mike, mógłbyś wyjaśnić, dlaczego interpolacja jest złym sposobem na obniżenie próby? Jeśli interpolacja jest zła, czy istnieje dobry sposób radzenia sobie z przypadkami, w których wymiary obrazu nie są podzielne przez pożądany rozmiar bloku? –

1

Ponieważ OP chce tylko rozwiązania courser, myślałem, że podzielę się moją drogą do zmniejszenia liczby pikseli o połowę w każdym wymiarze. Biorę średnią 2x2 bloków. Można stosować kilka razy, aby zmniejszyć przez czynniki 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]