如何在python中“反转”列表?像反函数

问题描述

我有一个名为 dis(x) 的复杂函数,它返回一个数字。

我正在制作两个列表,分别称为,indices'' 和,values''。所以我要做的是:

for i in np.arange(0.01,4,0.01):
    values.append(dis(i))
    indices.append(i)

所以我有以下问题,我如何找到一些索引 j(来自索引),其中 dis(j)(来自值)最接近某个数字 k。

解决方法

按照你的说法,我看到两个选项:

  1. 暴力破解(尝试多个索引 i,然后查看哪个 dis(i) 最终与 k 最接近。当 dis 相当快且可能的索引相当少时效果最佳。
  2. 了解优化: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'函数在范围内不是单调的,你可能在局部极值的两边都有多个正确答案。