在Python中使用查找表

时间:2018-05-24 11:29:58

标签: python python-3.x lookup-tables

我正在使用python来自动化压电液滴发生器。对于脉冲长度的每个值,将在那里产生合适的电压值以产生信号以释放液滴。该电压值在每次运行中都会发生变化(例如,+或-10)。所以我有一个每个脉冲长度的不同电压值的数据库。

我想知道在python中使用查找表的一些事情。对于我的任务,我想选择一个从15到70的随机脉冲长度,并将此值与来自数据库的特定电压范围相关联(例如:对于值17,我希望程序访问查找表和返回一系列电压35-50)。是否可以采用整个范围而不仅仅是单个值。既然,我是编码和python的新手,我不太确定。欢迎任何帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

由于我们没有获得有关哪些范围应与哪些值相关联的任何进一步信息,我假设您将我的答案转移到您自己的问题。

查找表在python中称为dictionary。它们用大括号表示。

简单的例子:

myDict = {1: [1, 2, 3, 4, 5],
          2: [2, 3, 4, 5, 6],
          3: [3, 4, 5, 6, 7]}

在这里,您可以创建一个包含三个条目的字典:1,2,3。每个条目都有一个与之关联的范围。在示例中,它是逻辑range(i, i+5)

您可以像列表一样查询“查找表”:

print(myDict[2])
>>> [2, 3, 4, 5, 6]

(请注意[2]不是索引#2,但实际上是您要查找的值2

通常,您不希望手动创建字典,而是希望自动构建字典。你可以,例如将dictzip

结合使用,将两个长度相同的列表合并到字典中
indices = range(15, 76) # your values from 15 to 75
i_ranges = [range(i, i+5) for i in indices] # this constructs your ranges
myDict = dict(zip(indices, i_ranges)) # zip together the lists and make a dict from it
print(myDict[20])
>>> [20, 21, 22, 23, 24]

顺便说一下,您不仅限于整数和列表。你也可以这样:

myFruits = {'apples': 20, 'cherries': 50, 'bananas': 23}
print(myFruits['cherries'])
>>> 50

答案 1 :(得分:1)

如果您可以将数据库放在一个大数组中(如果您的数据库不是太大),那么numpy是您的选择。

这是一个简单的例子:

import numpy

my_array = numpy.zeros([3, 8], dtype=numpy.uint8)

这将输出以下数组:

array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

从那里你可以使用以下行访问数组:

my_array[0]

它将输出第一行:

array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

你可以对列做同样的事情:

my_array[:, 0]

它将输出第一列:

array([ 0.,  0.,  0.])

使用词典也是一种好方法。

然而,numpy是用c ++编写的,所以,有时它比python集成函数更快,并且它提供了许多有用的功能,如均值,标准偏差,其中(检查数组中存在值的位置) )

您还可以使用numpy创建更复杂的数组并轻松探索它们

答案 2 :(得分:1)

以下是线性插值查找实现:

from bisect import bisect_left

def lookup(x, xs, ys):
    if x <= xs[0]:  return ys[0]
    if x >= xs[-1]: return ys[-1]

    i = bisect_left(xs, x)
    k = (x - xs[i-1])/(xs[i] - xs[i-1])
    y = k*(ys[i]-ys[i-1]) + ys[i-1]

    return y

用于测试:

xs = [1, 2, 4, 8, 16, 32, 64, 128, 256]
ys = [0, 1, 2, 3, 4, 5, 6, 7, 8]
i_xs = [i/1000-500 for i in range(1000000)]

start_time = time.time()
ys = [lookup(x, xs, ys) for x in i_xs]
print("%s secs" % (time.time() - start_time))

我大约需要1.8秒。