我正在尝试编写一个sigma剪辑程序,用于计算数组中每个点与其邻居之间的差异,如果差值大于数组标准偏差的x倍,则将邻居设置为等于平均值最接近它的两个点。例如,如果我有一个数组testarray = np.array([1.01, 2.0, 1.22, 1.005, .996, 0.95])
,并且想要更改任何偏离其邻居超过2倍的点,那么此函数将搜索数组并在{{1}中设置2.0等于testarray
,平均值为1.01和1.22。
1.115
此代码适用于此小def sigmaclip2(array, stand):
originalDeviation = np.std(array)
differences = np.abs(np.diff(array))
for i in range(len(differences)):
if differences[i] > stand*originalDeviation:
if array[i+1] != array[-1]:
array[i+1] = (array[i] + array[i+2]) / 2.0
else:
array[i+1] = (array[i] + array[i-1]) / 2.0
else:
pass
return array
。但是,我正在使用更大的数据集(~12000个元素)。当我尝试在较大的数据集上运行它时,我得到了与我插入的相同的数组。
有谁知道可能出现的问题?
我应该注意到我已经尝试了一些Python的内置sigma剪辑例程,例如来自Astropy的剪辑例程,但看起来好像会切断任何大于数组标准偏差x倍的值。这不是我想要做的。我想找到任何大的突然跳跃(通常由1个坏值引起)并设置该坏值等于它周围的2个点的平均值,如果坏值大于与其邻居差异的标准偏差的x倍。
答案 0 :(得分:0)
可能是拼写错误,因为它总是使用数组的最后一个元素。你错过了我吗?在这种情况下,你可能需要换一个,因为差异[0]是数组[0]和数组[1]之间的差异
PS我想我会在数组上使用带有切片表示法的np.where来查找要改变的索引而不是使用普通的python循环。有了numpy,循环几乎总是一个坏主意。
修改
了解边缘,但我不认为您的代码符合您的预期。当我运行它时,它将数组[2]平均为1.06,将数组[1]平均为1.115
如果我将第6行更改为if array[i+1] != array[i-1]:
(数组[-1]是最后一个条目,总是0.95),它仍然无法正常工作。
您还必须考虑您希望代码在您获得多个异常值的情况下执行的操作。1.01, 2.0, 2.25, 1.99, 1.22, 1.005, .996, 0.95
为了应对单个异常值,我会使用类似
def sigmaclip3(array, stand):
cutoff = stand * np.std(array)
diffs = np.abs(np.diff(array))
ix = np.where((diffs[:-1] > cutoff) &
(diffs[1:] > cutoff))[0] + 1
array[ix] = (array[ix - 1] + array[ix + 1]) / 2.0
return array