1

astropy モジュールを使用してデータを平滑化しようとしています。1D の例として、次のコードを試しました。

import numpy as np
from astropy import convolution as conv
var1=np.arange(10)
kernel=np.asarray([-1,1,0])
conv.convolve(var1,kernel)

これは私の場合に戻ります:array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])

戻るはずだと思いましたarray([0,1,1,1,1,1,1,1,1,1])。var1 データ型 uint8、int8、および float32 を使用してみました。も使用してみconvolve_fftましたが、同じ結果になりました。

私は scipy の畳み込みフィルターに精通していますが、NaN 値が実際にデータに存在する場合にアストロピーを使用して、それらを滑らかにしたいと考えています。

4

2 に答える 2

0

すでに指摘したように、カーネルの合計がゼロであるためです。

>>> import numpy as np
>>> np.sum(kernel)  # kernel = np.asarray([-1,1,0])
0

kernel配列内の値を正規化せずにastropy.convolution.convolve常にカーネルを正規化してNaN(アストロピー1.3もマスクされているため)値を補間し、結果を元のカーネルの合計で再度乗算する場合、それ自体は問題になりません(明示的にあなたを除く)使用normalize_kernel=True)。


あなたはすでにそれに精通していると述べていますが、いつでも使用できますscipy.ndimage.convolve

>>> from scipy.ndimage import convolve

>>> convolve(var1, kernel[::-1])  # var1=np.arange(10)
array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1])

補間と畳み込み、およびNaN位置を自分で行います。(あまりいいとは言えませんが、ゼロサム、非対称、および混合符号付きカーネルでは、適切に畳み込みを行うことができません)。

[::-1]を使用する場合は、カーネルを逆にする (したがって ) 必要があります。

あなたの場合、単に使用することもできますnumpy.diff(先行ゼロを削除します):

>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])
于 2016-12-27T16:13:16.453 に答える