您好我有两个numpy数组(在这种情况下代表深度和百分比深度剂量数据)如下:
depth = np.array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ,
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.2,
2.4, 2.6, 2.8, 3. , 3.5, 4. , 4.5, 5. , 5.5])
pdd = np.array([ 80.40649399, 80.35692155, 81.94323956, 83.78981286,
85.58681373, 87.47056637, 89.39149833, 91.33721651,
93.35729334, 95.25343909, 97.06283306, 98.53761309,
99.56624117, 100. , 99.62820672, 98.47564754,
96.33163961, 93.12182427, 89.0940637 , 83.82699219,
77.75436857, 63.15528566, 46.62287768, 29.9665386 ,
16.11104226, 6.92774817, 0.69401413, 0.58247614,
0.55768992, 0.53290371, 0.5205106 ])
当绘制时给出以下曲线:
我需要找到pdd下降到给定值的深度(最初为50%)。我已经尝试在pdd达到100%的位置切片,因为我只对这之后的点感兴趣。
不幸的是,np.interp
似乎只在x和y值都有效的情况下起作用。
有人可以建议下一步该去哪儿吗?
答案 0 :(得分:1)
如果我理解正确,您希望在depth = f(pdd)
处插入函数pdd = 50.0
。出于插值的目的,您可以将pdd
视为与“x”值对应,将depth
视为与“y”值对应。
您可以使用np.argsort
按“x”的升序(即升序pdd
)对“x”和“y”进行排序,然后像往常一样使用np.interp
:
# `idx` is an an array of integer indices that sorts `pdd` in ascending order
idx = np.argsort(pdd)
depth_itp = np.interp([50.0], pdd[idx], depth[idx])
plt.plot(depth, pdd)
plt.plot(depth_itp, 50, 'xr', ms=20, mew=2)
答案 1 :(得分:0)
这不是一个真正的编程解决方案,但它是你如何找到深度。我冒昧地重命名你的变量,所以x(i) = depth(i)
和y(i) = pdd(i)
。
在给定的时间间隔[x(i),x(i+1)]
中,线性插值是
p_1(X) = y(i) + (X - x(i))*(y(i+1) - y(i))/(x(i+1) - x(i))
您希望找到X
p_1(X) = 50
。首先找i
x(i)>50
和x(i+1)
,然后可以重新排列上面的等式来给出
X = x(i) + (50 - y(i))*((x(i+1) - x(i))/(y(i+1) - y(i)))
对于你的数据(使用MATLAB;抱歉,没有python代码)我大约2.359
。然后可以使用np.interp(X, depth, pdd)
答案 2 :(得分:0)
有几种方法可以进行插值。对于您的情况,您基本上在寻找50%的深度,这在您的数据中是不可用的。最简单的插值是线性情况。我在C ++中使用numerical recipes库通过几种技术获取插值,因此,
线性插值:请参阅第117页
插值深度(50%): 2.35915
多项式插值,请参阅第117页
插值深度(50%): 2.36017
三次样条插值,请参阅第120页
插值深度(50%): 2.19401
Rational Function Interpolation:参见第124页
插值深度(50%): 2.35986