出于某种原因,我对我以前用过的东西感到疯狂,但它从来没有给我这个问题。可能出了什么问题?它一直给我一个常量数组,而这绝对不应该是这样的。
r0 = np.linspace(2, 215, 1000) f = 8.9*np.sqrt(4.8e9/(r0**14) + 3e8/(r0**6) + 1.4e6/(r0**2.3)) ds = np.array([3950, 1837, 1347, 900]) np.interp(ds, f, r0)
字符串
h6my8fg21#
numpy.interp期望已知的x坐标(即第二个参数,即你的f)是单调递增的。如documentation states:预期X坐标序列增加,但这不是明确强制的。然而,如果序列xp是非递增的,则插值结果是无意义的。r0(已知y坐标)是递增序列,而f(已知x坐标)是递减序列。你应该可以通过反转r0得到你想要的结果(因此,f也被反转了):
numpy.interp
f
r0
import numpy as np r0 = np.linspace(215, 2, 1000) # Reversed endpoints compared to original f = 8.9*np.sqrt(4.8e9/(r0**14) + 3e8/(r0**6) + 1.4e6/(r0**2.3)) ds = np.array([3950, 1837, 1347, 900]) print(np.interp(ds, f, r0))
字符串其给出:
[3.65932599 5.34470808 6.49802343 8.7453899 ]
型
qlfbtfca2#
我假设你是自愿从r0计算出f的,但随后使用interp从f类值计算出r0类值。换句话说,您正在尝试估计r0 → 8.9*np.sqrt(4.8e9/(r0**14) + 3e8/(r0**6) + 1.4e6/(r0**2.3))的逆函数。问题是,interp假设x部分是升序排序的。就像大多数时候,当你np.interp(somevalues, np.linspace(0,1,100), func(np.linspace(0,1,100))在这里,显然,你试图反转的函数是单调的(至少看起来是这样)和递减的。所以你的f是有序的,但是是降序的。只要把两个数组都颠倒过来就行了
r0 → 8.9*np.sqrt(4.8e9/(r0**14) + 3e8/(r0**6) + 1.4e6/(r0**2.3))
interp
x
np.interp(somevalues, np.linspace(0,1,100), func(np.linspace(0,1,100))
np.interp(ds, f[::-1], r0[::-1])
2条答案
按热度按时间h6my8fg21#
numpy.interp
期望已知的x坐标(即第二个参数,即你的f
)是单调递增的。如documentation states:
预期X坐标序列增加,但这不是明确强制的。然而,如果序列xp是非递增的,则插值结果是无意义的。
r0
(已知y坐标)是递增序列,而f
(已知x坐标)是递减序列。你应该可以通过反转
r0
得到你想要的结果(因此,f
也被反转了):字符串
其给出:
型
qlfbtfca2#
我假设你是自愿从
r0
计算出f
的,但随后使用interp从f
类值计算出r0
类值。换句话说,您正在尝试估计r0 → 8.9*np.sqrt(4.8e9/(r0**14) + 3e8/(r0**6) + 1.4e6/(r0**2.3))
的逆函数。问题是,
interp
假设x
部分是升序排序的。就像大多数时候,当你np.interp(somevalues, np.linspace(0,1,100), func(np.linspace(0,1,100))
在这里,显然,你试图反转的函数是单调的(至少看起来是这样)和递减的。所以你的f是有序的,但是是降序的。
只要把两个数组都颠倒过来就行了
字符串