首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >astropy.convolution.convolve返回nan值

astropy.convolution.convolve返回nan值
EN

Stack Overflow用户
提问于 2015-07-01 08:01:54
回答 2查看 979关注 0票数 1

我正在尝试使用无意义模块来平滑我的数据。作为一个1D示例,我尝试了以下代码:

代码语言:javascript
复制
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,以便使它们平滑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-01 09:52:55

您的内核和为零,因此,astropy将引发警告

代码语言:javascript
复制
RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum

这最终导致了所有的nans

票数 3
EN

Stack Overflow用户

发布于 2016-12-27 16:13:16

如前所述,这是因为内核之和为零:

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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 (它删除了前导零):

代码语言:javascript
复制
>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31155735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档