web-dev-qa-db-ja.com

Pythonのダウンサンプル配列

基本的な2-D numpy配列があり、それらをより粗い解像度に「ダウンサンプリング」したいと思います。これを簡単に行うことができるシンプルなnumpyまたはscipyモジュールはありますか?また、この配列はBasemapモジュールを介して地理的に表示されていることに注意する必要があります。

サンプル: enter image description here

28
wuffwuff

scikit-imageは、ここでdownsamplingの作業バージョンを実装しましたが、正しく理解すれば、DSPの観点からダウンサンプリングではないため、downsamplingと呼ぶことを避けます。

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

しかし、それは非常にうまく機能し、私が見つけた唯一のdownsamplerがPythonで処理できるnp.nan画像内。私はこれで巨大な画像をすぐにダウンサンプリングしました。

13
K.-Michael Aye

ダウンサンプリングするとき、補間は行うのが間違っています。常に集約的なアプローチを使用してください。

私はこれを行うためにブロック手段を使用し、「ファクター」を使用して解像度を下げます。

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(5x5ブロック)を使用する(100、200)形状配列は、(20、40)配列結果になります:

ar = np.random.Rand(20000).reshape((100, 200))
block_mean(ar, 5).shape  # (20, 40)
10
Mike T

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行列です

4
Hammer

OPはコースの解像度を必要とするだけなので、各次元でピクセル数を半分に減らす方法を共有すると思いました。 2x2ブロックの平均を取ります。これを複数回適用して、2倍に減らすことができます。

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

これはあなたが探しているものではないかもしれませんが、完全を期すために言及したいと思いました。

scikits.sampleratedocs )をインストールしてみてください。これは、Python libsamplerateのラッパーです。ナイスで高品質のリサンプリングアルゴリズムを提供します。私が知る限り、それは1Dでのみ動作します。最初に1つの軸に沿って、次に別の軸に沿って2D信号をリサンプリングできる場合がありますが、最初は高品質のリサンプリングの利点に反する可能性があると思います。

1
lmjohns3

最も簡単な方法array[0::2]表記法。1秒おきのインデックスのみを考慮します。例えば。

array= np.array([[i+j for i in range(0,10)] for j in range(0,10)])
down_sampled=array[0::2,0::2]

print("array \n", array)
print("array2 \n",down_sampled)

出力があります:

array 
[[ 0  1  2  3  4  5  6  7  8  9]
 [ 1  2  3  4  5  6  7  8  9 10]
 [ 2  3  4  5  6  7  8  9 10 11]
 [ 3  4  5  6  7  8  9 10 11 12]
 [ 4  5  6  7  8  9 10 11 12 13]
 [ 5  6  7  8  9 10 11 12 13 14]
 [ 6  7  8  9 10 11 12 13 14 15]
 [ 7  8  9 10 11 12 13 14 15 16]
 [ 8  9 10 11 12 13 14 15 16 17]
 [ 9 10 11 12 13 14 15 16 17 18]]
array2 
[[ 0  2  4  6  8]
 [ 2  4  6  8 10]
 [ 4  6  8 10 12]
 [ 6  8 10 12 14]
 [ 8 10 12 14 16]]
0
Kolibril