问题描述
我正在制作两个列表,分别称为,indices'' 和,values''。所以我要做的是:
for i in np.arange(0.01,4,0.01):
values.append(dis(i))
indices.append(i)
所以我有以下问题,我如何找到一些索引 j(来自索引),其中 dis(j)(来自值)最接近某个数字 k。
解决方法
按照你的说法,我看到两个选项:
- 暴力破解(尝试多个索引 i,然后查看哪个 dis(i) 最终与 k 最接近。当 dis 相当快且可能的索引相当少时效果最佳。
- 了解优化:https://en.wikipedia.org/wiki/Optimization_problem。这是一个相当广泛的领域,但 python SciPy 包有很多优化功能。
numpy 中 enumerate 和 argmin 函数的组合将为您完成这项工作。
import numpy as np
values = []
indices = []
def dis(x):
return 1e6*x**2
for i in np.arange(0.01,4,0.01):
values.append(dis(i))
indices.append(i)
target = 10000
closest_index = np.argmin([np.abs(x-target) for x in values])
print(closest_index)
,
使用 numpy
closestindice = np.argmin(np.abs(np.array(values)-k))
但这很奇怪,因为它不使用“索引”列表。
也许您可以跳过“索引”列表的定义并获取 numpy 数组中的值。
import numpy as np
def dis(i):
return ((i-1)**2)
nprange = np.arange(0.01,0.01)
npvalues = np.array([dis(x) for x in nprange])
k = .5
closestindice = np.abs(npvalues-k).argmin()
print(closestindice,npvalues[closestindice])
输出:
28 0.5041
顺便说一句,如果'dis'函数在范围内不是单调的,你可能在局部极值的两边都有多个正确答案。