Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找数组中数据点之间的大跳转时遇到问题_Python_Arrays_Numpy - Fatal编程技术网

Python 查找数组中数据点之间的大跳转时遇到问题

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

我试图编写一个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):
  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提示,我会试试看是否有用!