我正在尝试使用无意义模块来平滑我的数据。作为一个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,结果也是一样。
我对枕叶的卷积滤波器很熟悉,但我想在我的数据中实际出现NaN值时,使用astropy,以便使它们平滑。
发布于 2015-07-01 09:52:55
您的内核和为零,因此,astropy将引发警告
RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum这最终导致了所有的nans。
发布于 2016-12-27 16:13:16
如前所述,这是因为内核之和为零:
>>> import numpy as np
>>> np.sum(kernel) # kernel = np.asarray([-1,1,0])
0如果不对kernel进行规范化,这本身就不是问题,但是astropy.convolution.convolve总是对内核进行规范化,以便在数组中对NaN进行内插(因为astropy1.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])https://stackoverflow.com/questions/31155735
复制相似问题