返回排序列表中的值的位置

时间:2017-06-23 16:29:43

标签: python

我希望我能正确地描述这一点:我希望根据对象的当前状态,转换矩阵和随机变量来更新对象的状态(" rv&# 34)。

作为一个例子,假设我有一个N元素矩阵,有三种状态(比如,Solid,Liquid,Gas)。每个州都有自己改变国家的概率。 A'阈值'当与rv相比时确定状态。

例如,

         Solid     Liquid       Gas
Solid    .50        .75          1.00

Liquid   .25        .50          1.00

Gas      .15        .35          1.00

我想编写一个给出这个转换矩阵,当前状态和rv的函数,以尽可能高效的方式返回新状态(我正在运行许多模拟,并且实际矩阵比3×3)。

这是我的代码,其中'值'是rv,'列表'是包含上述值的选定行的排序列表。 EG,for" Solid"清单是:

[50,.75,1.0]

def return_location(value, list):
 # Returns location i from sorted list where value is >= i and < i+1
 len = length(list)
 for i in range(0,(len-1)):
     if value < list[i]
         return(i)
         break;

任何想法都赞赏!

2 个答案:

答案 0 :(得分:0)

所以,我不确定这是否有用,但是这里有一种快速方法可以使用numpy.random.multinomial将每个转换行应用到包含总体的状态向量。

import numpy as np

transition = [
    [0.50, 0.25, 0.25],
    [0.25, 0.25, 0.50],
    [0.15, 0.35, 0.50]
]

state = [10, 20, 30] # 10 solid, 20 liquid, 30 gas

def update_state(state, transition):
    return sum(np.random.multinomial(s, r) for s, r in zip(state, transition))

print update_state(state, transition) # [12 17 31] - 12 solid, 17 liquid, 31 gas

答案 1 :(得分:0)

您要搜索的内容为binary search,模块bisect中提供bisect函数

import bisect
l = [2,4,6,8,9,10]

bisect.bisect(l, 3)
>>> 1

如果数字大于最后一个元素,它可以返回len(l)以上,但这可以通过检查轻松解决

bisect.bisect(l, 10)
>>> 6