Python 查找数组中数据点之间的大跳转时遇到问题
我试图编写一个sigma裁剪程序,计算数组中每个点与其相邻点之间的差值,如果差值大于数组标准偏差的x倍,它会将相邻点设置为最接近它的两个点的平均值。例如,如果我有一个数组,Python 查找数组中数据点之间的大跳转时遇到问题,python,arrays,numpy,Python,Arrays,Numpy,我试图编写一个sigma裁剪程序,计算数组中每个点与其相邻点之间的差值,如果差值大于数组标准偏差的x倍,它会将相邻点设置为最接近它的两个点的平均值。例如,如果我有一个数组,testarray=np.array([1.01,2.0,1.22,1.005,996,0.95]),并且想要更改任何偏离相邻数组2倍以上的点,那么这个函数将搜索整个数组,并将testarray中的2.0设置为1.115,平均值为1.01和1.22 def sigmaclip2(array, stand): origina
testarray=np.array([1.01,2.0,1.22,1.005,996,0.95])
,并且想要更改任何偏离相邻数组2倍以上的点,那么这个函数将搜索整个数组,并将testarray
中的2.0设置为1.115
,平均值为1.01和1.22
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
此代码适用于此小型testarray
。但是,我使用的是更大的数据集(约12000个元素)。当我尝试在更大的数据集上运行它时,我得到的是我插入的相同阵列
有人知道会出什么问题吗
我应该注意到,我已经尝试了一些Python内置的sigma裁剪例程,比如Astropy中的一个,但是它似乎切断了任何大于数组标准偏差x倍的值。这不是我想做的。我想找到任何大的、突然的跳跃(通常由1个坏值引起),如果坏值大于其相邻值的标准偏差的x倍,则将该坏值设置为其周围2个点的平均值 函数数组的第6行[-1]可能是一个输入错误,因为它总是使用数组的最后一个元素。你错过了一个i吗?在这种情况下,您可能需要移动1,因为差值[0]是数组[0]和数组[1]之间的差值 PS我想我应该使用np.where和数组上的切片表示法来查找要修改的索引,而不是使用普通的python循环。对于numpy,循环几乎总是一个坏主意 编辑 了解边,但我认为您的代码没有达到预期效果。当我运行它时,它的平均值是数组[2]到1.06,以及数组[1]到1.115 如果我将第6行更改为
If数组[I+1]!=数组[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
根据我现在编写的代码,我将取最接近差异点的两点的平均值。如果差异点恰好是数组中的最后一个点,则此操作不起作用,因为不能使用数组末尾后的点进行平均。这条线将我试图修改的数组的值与数组的最后一个元素进行比较,看它们是否相同,如果相同,则以不同的方式取平均值。谢谢你的np.where提示,我会试试看是否有用!