numpy np.interp返回常量数组

2fjabf4q  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(90)

出于某种原因,我对我以前用过的东西感到疯狂,但它从来没有给我这个问题。
可能出了什么问题?它一直给我一个常量数组,而这绝对不应该是这样的。

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)

字符串

h6my8fg2

h6my8fg21#

numpy.interp期望已知的x坐标(即第二个参数,即你的f)是单调递增的。
documentation states
预期X坐标序列增加,但这不是明确强制的。然而,如果序列xp是非递增的,则插值结果是无意义的。
r0(已知y坐标)是递增序列,而f(已知x坐标)是递减序列。
你应该可以通过反转r0得到你想要的结果(因此,f也被反转了):

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 ]

qlfbtfca

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是有序的,但是是降序的。
只要把两个数组都颠倒过来就行了

np.interp(ds, f[::-1], r0[::-1])

字符串

相关问题