2017-06-23 115 views
1

我希望我正確地描述了這一點:我正在尋找基於對象的當前狀態,轉換矩陣和隨機變量(「rv」)更新對象的狀態。作爲一個例子,假設我有一個由三個狀態(比如固體,液體,氣體)組成的N個元素的矩陣。每個州都有自己改變國家的可能性。與rv相比較的「閾值」決定了狀態。從排序列表中返回值的位置

例如,

  Solid  Liquid  Gas 
Solid .50  .75   1.00 

Liquid .25  .50   1.00 

Gas  .15  .35   1.00 

我想寫入該給定的這種轉變矩陣的功能,當前狀態,和RV,返回作爲高效的方式儘可能新的狀態(我運行許多模擬,並且實際的矩陣比3x3大得多)。

這裏是我的代碼,其中'value'是rv,'list'是包含上述值的選定行的排序列表。例如,對於 「固體」 的名單是:

[.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; 

任何想法讚賞!

+0

但是,邏輯如何選擇屬性? – GPB

+0

對不起,要麼是我不明白,要麼是不清楚:我想通過參考一個RV來選擇一個新的狀態,它是當前狀態的函數。例如,如果當前狀態爲「固體」且RV(U [0,1))爲0.8,則新狀態將爲「氣體」。不知道如何做到這一點,沒有一個循環,我不認爲是Pythonic - 或高效。 – GPB

+0

已經開始製作一個函數來進一步展示你想要做什麼?我不明白你使用的術語,如RV - 是參考值的縮寫嗎?這個學習/工作領域是什麼,例如物理?是否有任何可以鏈接到的文檔/在線參考文件是一個示例或進一步解釋這些概念?對不起,只是想幫助別人,直到有人出現。謝謝。 – davedwards

回答

0

您正在搜索的內容binary search,它是模塊可bisectbisect功能

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

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

它可以返回除LEN(L)以上,如果數量大於最後一個元素較大,但這可以通過檢查輕鬆解決

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

是的,這似乎工作。我會將其與我的功能進行比較並報告回來。謝謝您的幫助! – GPB

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 
+0

不知道我是否明確指出了問題 - 我只是將「狀態」視爲布爾值而不是值。 – GPB

+0

@GPB是的,我不是真的在問你的問題。這相當於在'state'中指定的起始狀態運行60次模擬並累計結果。既然你說你正在運行許多模擬,那麼很可能有一種並行的優雅方式。 –