astropy.convolution.convolve returns 纳米值
astropy.convolution.convolve returns nan values
我正在尝试使用 astropy 模块来平滑我的数据。作为一维示例,我尝试了以下代码:
import numpy as np
from astropy import convolution as conv
var1=np.arange(10)
kernel=np.asarray([-1,1,0])
conv.convolve(var1,kernel)
我的 return 是:array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
我假设它应该 return array([0,1,1,1,1,1,1,1,1,1])
。我已经尝试使用 var1 数据类型 uint8、int8 和 float32。我也试过使用 convolve_fft
,结果相同。
我熟悉 scipy 的卷积滤波器,但我想在我的数据中实际存在 NaN 值时使用 astropy,以便平滑它们。
您的内核总和为零,因此,astropy
将发出警告
RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum
最终导致所有 nans
。
正如已经指出的那样,这是因为您的内核总和为零:
>>> import numpy as np
>>> np.sum(kernel) # kernel = np.asarray([-1,1,0])
0
如果不规范化 kernel
但 astropy.convolution.convolve
总是规范化内核以在 NaN
上进行插值(因为 astropy 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
定位! (不太好,但使用零和、不对称和混合签名内核,您无法正确进行卷积)。
但是,在使用 scipy.
时,您需要反转(因此 [::-1]
)内核
在您的情况下,您也可以简单地使用 numpy.diff
(删除前导零):
>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])
我正在尝试使用 astropy 模块来平滑我的数据。作为一维示例,我尝试了以下代码:
import numpy as np
from astropy import convolution as conv
var1=np.arange(10)
kernel=np.asarray([-1,1,0])
conv.convolve(var1,kernel)
我的 return 是:array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
我假设它应该 return array([0,1,1,1,1,1,1,1,1,1])
。我已经尝试使用 var1 数据类型 uint8、int8 和 float32。我也试过使用 convolve_fft
,结果相同。
我熟悉 scipy 的卷积滤波器,但我想在我的数据中实际存在 NaN 值时使用 astropy,以便平滑它们。
您的内核总和为零,因此,astropy
将发出警告
RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum
最终导致所有 nans
。
正如已经指出的那样,这是因为您的内核总和为零:
>>> import numpy as np
>>> np.sum(kernel) # kernel = np.asarray([-1,1,0])
0
如果不规范化 kernel
但 astropy.convolution.convolve
总是规范化内核以在 NaN
上进行插值(因为 astropy 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
定位! (不太好,但使用零和、不对称和混合签名内核,您无法正确进行卷积)。
但是,在使用 scipy.
时,您需要反转(因此[::-1]
)内核
在您的情况下,您也可以简单地使用 numpy.diff
(删除前导零):
>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])