无法在阵列中的数据点之间找到大的跳跃

时间:2017-04-23 19:36:00

标签: python arrays numpy

我正在尝试编写一个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倍。

1 个答案:

答案 0 :(得分:0)

函数数组[-1]的第6行中的

可能是拼写错误,因为它总是使用数组的最后一个元素。你错过了我吗?在这种情况下,你可能需要换一个,因为差异[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