gpt4 book ai didi

python - 使用python删除曲线下方的数据点

转载 作者:太空狗 更新时间:2023-10-29 22:23:36 24 4
gpt4 key购买 nike

我需要用python比较一些理论数据和真实数据。理论数据来自求解方程。为了改进比较,我想删除远离理论曲线的数据点。我的意思是,我想删除图中红色虚线下方和上方的点(使用 matplotlib 制作)。 Data points and theoretical curves

理论曲线和数据点都是不同长度的数组。

我可以尝试以粗略的方式删除这些点,例如:可以使用以下方法检测第一个上点:

data2[(data2.redshift<0.4)&data2.dmodulus>1]
rec.array([('1997o', 0.374, 1.0203223485103787, 0.44354759972859786)], dtype=[('SN_name', '|S10'), ('redshift', '<f8'), ('dmodulus', '<f8'), ('dmodulus_error', '<f8')])

但我想用一种不那么粗略的方式。

那么,谁能帮我找到一个简单的方法来删除有问题的点?

谢谢!

最佳答案

这可能有点矫枉过正,并且是基于您的评论

Both the theoretical curves and the data points are arrays of different length.

我会做以下事情:

  1. 截断数据集,使其 x 值位于理论集的最大值和最小值范围内。
  2. 使用 scipy.interpolate.interp1d 和上述截断数据 x 值对理论曲线进行插值。之所以进行第(1)步是为了满足interp1d的约束条件。
  3. 使用 numpy.where 查找超出可接受理论值范围的数据 y 值。
  4. 不要丢弃这些值,正如评论和其他答案中所建议的那样。如果您想清楚起见,请通过绘制一种颜色的“内衬”和另一种颜色的“离群值”来指出它们。

我认为这是一个接近您正在寻找的脚本。它有望帮助您完成您想要的:

import numpy as np
import scipy.interpolate as interpolate
import matplotlib.pyplot as plt

# make up data
def makeUpData():
'''Make many more data points (x,y,yerr) than theory (x,y),
with theory yerr corresponding to a constant "sigma" in y,
about x,y value'''
NX= 150
dataX = (np.random.rand(NX)*1.1)**2
dataY = (1.5*dataX+np.random.rand(NX)**2)*dataX
dataErr = np.random.rand(NX)*dataX*1.3
theoryX = np.arange(0,1,0.1)
theoryY = theoryX*theoryX*1.5
theoryErr = 0.5
return dataX,dataY,dataErr,theoryX,theoryY,theoryErr

def makeSameXrange(theoryX,dataX,dataY):
'''
Truncate the dataX and dataY ranges so that dataX min and max are with in
the max and min of theoryX.
'''
minT,maxT = theoryX.min(),theoryX.max()
goodIdxMax = np.where(dataX<maxT)
goodIdxMin = np.where(dataX[goodIdxMax]>minT)
return (dataX[goodIdxMax])[goodIdxMin],(dataY[goodIdxMax])[goodIdxMin]

# take 'theory' and get values at every 'data' x point
def theoryYatDataX(theoryX,theoryY,dataX):
'''For every dataX point, find interpolated thoeryY value. theoryx needed
for interpolation.'''
f = interpolate.interp1d(theoryX,theoryY)
return f(dataX[np.where(dataX<np.max(theoryX))])

# collect valid points
def findInlierSet(dataX,dataY,interpTheoryY,thoeryErr):
'''Find where theoryY-theoryErr < dataY theoryY+theoryErr and return
valid indicies.'''
withinUpper = np.where(dataY<(interpTheoryY+theoryErr))
withinLower = np.where(dataY[withinUpper]
>(interpTheoryY[withinUpper]-theoryErr))
return (dataX[withinUpper])[withinLower],(dataY[withinUpper])[withinLower]

def findOutlierSet(dataX,dataY,interpTheoryY,thoeryErr):
'''Find where theoryY-theoryErr < dataY theoryY+theoryErr and return
valid indicies.'''
withinUpper = np.where(dataY>(interpTheoryY+theoryErr))
withinLower = np.where(dataY<(interpTheoryY-theoryErr))
return (dataX[withinUpper],dataY[withinUpper],
dataX[withinLower],dataY[withinLower])
if __name__ == "__main__":

dataX,dataY,dataErr,theoryX,theoryY,theoryErr = makeUpData()

TruncDataX,TruncDataY = makeSameXrange(theoryX,dataX,dataY)

interpTheoryY = theoryYatDataX(theoryX,theoryY,TruncDataX)

inDataX,inDataY = findInlierSet(TruncDataX,TruncDataY,interpTheoryY,
theoryErr)

outUpX,outUpY,outDownX,outDownY = findOutlierSet(TruncDataX,
TruncDataY,
interpTheoryY,
theoryErr)
#print inlierIndex
fig = plt.figure()
ax = fig.add_subplot(211)

ax.errorbar(dataX,dataY,dataErr,fmt='.',color='k')
ax.plot(theoryX,theoryY,'r-')
ax.plot(theoryX,theoryY+theoryErr,'r--')
ax.plot(theoryX,theoryY-theoryErr,'r--')
ax.set_xlim(0,1.4)
ax.set_ylim(-.5,3)
ax = fig.add_subplot(212)

ax.plot(inDataX,inDataY,'ko')
ax.plot(outUpX,outUpY,'bo')
ax.plot(outDownX,outDownY,'ro')
ax.plot(theoryX,theoryY,'r-')
ax.plot(theoryX,theoryY+theoryErr,'r--')
ax.plot(theoryX,theoryY-theoryErr,'r--')
ax.set_xlim(0,1.4)
ax.set_ylim(-.5,3)
fig.savefig('findInliers.png')

这个图是结果: enter image description here

关于python - 使用python删除曲线下方的数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com