Почему моя функция cra sh второй раз вызывается из python, а l oop? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь смоделировать алгоритм Гиллеспи для клеточных систем в python 3.8, используя простую систему со следующими объектами: Фермент, Субстрат, Фермент-субстратный комплекс, Продукт.

У меня есть следующий код, вычисляет функции склонности для серии реакций, представленных в виде строк массива:

propensity = np.zeros(len(LHS))

def propensity_calc(LHS, popul_num, stoch_rate):
    for row in range(len(LHS)):     
            a = stoch_rate[row]        
            for i in range(len(popul_num)):      
                if (popul_num[i] >= LHS[row, i]):             
                    binom_rxn = (binom(popul_num[i], LHS[row, i]))    
                    a = a*binom_rxn            
                else: 
                    a = 0   
                    break 
            propensity[row] = a
    return propensity.astype(float)

Входные массивы следующие:

popul_num = np.array([200, 100, 0, 0])
LHS = np.array([[1,1,0,0], [0,0,1,0], [0,0,1,0]])
stoch_rate = np.array([0.0016, 0.0001, 0.1000])

Функция работает должным образом, пока я не попробуйте вызвать его из следующего, пока l oop:

while tao < tmax: 
propensity_calc(LHS, popul_num, stoch_rate)
a0 = sum(propensity)
if a0 <= 0:
    break
else:
    t = np.random.exponential(a0)   
    print(t)   
    # sample time system stays in given state from exponential distribution of the propensity sum. 
    if tao + t > tmax: 
        tao = tmax
        break
j = stats.rv_discrete(name="Reaction index", values=(num_rxn, rxn_probability)).rvs()   # array of reactions increasing by 1 until they get to the same length/size as rxn_probability
print(j)
tao = tao + t       
popul_num = popul_num + state_change_matrix[j]      # update state of system/ popul_num

Другие переменные в while l oop следующие:

a0 = sum(propensity)

def prob_rxn_fires(propensity, a0):
prob = propensity/a0   
return prob 
rxn_probability = (prob_rxn_fires(propensity, a0))

num_rxn = np.arange(1, rxn_probability.size + 1).reshape(rxn_probability.shape)

Когда я запускаю код, вызывающий функцию calc_propensity из while l oop, он проходит первую итерацию while l oop со следующей ошибкой:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Ошибка сначала возникает на следующем строка функции calc_propensity:

if (popul_num[i] >= LHS[row, i]):

, но по какой-то причине код продолжает работать, пока не достигнет той же строки в функции calc_propensity b ut во втором вызове функции (while l oop), и я не понимаю, почему?

ура

1 Ответ

2 голосов
/ 05 мая 2020

Похоже, что значения в операторе if в первую очередь не должны использоваться в условном if. Вам следует использовать функции .any () или .all (). Вот ссылка, чтобы проиллюстрировать, что означает ValueError:

https://sopython.com/canon/119/the-truth-value-of-an-array-with-more-than-one-element-is-ambiguous/

...