Python Индекс 3 выходит за пределы оси 0 с размером 3 - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь вычислить биномиальный коэффициент между двумя элементами следующих массивов:

popul_num = np.array([100, 200, 0, 0]) --> #The discrete number of entities in each reaction
LHS = np.array([[1,1,0,0], [0,0,1,0], [0,0,1,0]]) --> #three rows for 3 different reactions, each row has 4 elements describing the ratio of reactants in that particular reaction
stoch_rate = np.array([0.0016, 0.0001, 0.1000])

В моей системе 4 объекта; Фермент, субстрат, фермент-субстратный комплекс и продукт. Которые описываются дискретными номерами реагентов в popul_num и как rat ios между реагентами в матрицах LHS, в этом порядке.

Биномиальный коэффициент следует рассчитывать, используя для каждого объекта дискретное число молекул и его соотношение между другими объектами в этой конкретной реакции, приведенной в LHS. Что приведет к функции склонности к этой реакции (см. Ниже)

На днях я задал вопрос, когда получил ошибку индексации: index 3 is out of bounds for axis 0 with size 3, но это было исправлено, убедившись, что я ссылаюсь на индексы вместо значений.

Но в той версии моего кода я использовал матрицы вместо массивов, с тех пор я понял, что длина матрицы popul_num была 1, поэтому я всегда был 0, и мой расчет биномиального коэффициента не работал Поэтому я преобразовал свои матрицы в массивы, чтобы сгладить массив popul_num в одномерный массив длиной 4 -> (не уверен, что это лучший метод, хотя приветствуются любые другие предложения)

Но я снова получаю ошибку index 3 is out of bounds for axis 0 with size 3 и я не знаю почему? Есть ли разница в способе python для ссылочных значений или индексов циклов в матрицах и массивах?

Это код, который я получил до сих пор:

for j in range(len(LHS)):
    cj = stoch_rate
    for i in range(len(popul_num)):
        if i >= LHS[i,j]:        
            binon_rxn = binom(i, LHS[i, j])     # binomial coefficent isnt working! Always returns 1! 
            print(binon_rxn)        
            aj = cj*binon_rxn            
        else: 
            cj == 0           
            aj = (cj*binom(i, LHS[i, j]))
    print("Propensity function per reaction:\n", aj)

1 Ответ

0 голосов
/ 28 апреля 2020

Проблема была в итераторах двух циклов for. Первый итератор должен быть i, а не j, а второй должен быть j вместо i.

import numpy as np
from scipy.special import binom


popul_num = np.array([100, 200, 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])

for i in range(len(LHS)):  #change this to `i`
    cj = stoch_rate
    for j in range(len(popul_num)): # change this to `j`
        if i >= LHS[i,j]:        
            binon_rxn = binom(i, LHS[i, j])     # binomial coefficent isnt working! Always returns 1! 
            print(binon_rxn)        
            aj = cj*binon_rxn            
        else: 
            cj == 0           
            aj = (cj*binom(i, LHS[i, j]))
    print("Propensity function per reaction:\n", aj)

, что приводит к выводу:

1.0
1.0
Propensity function per reaction:
 [0.0016 0.0001 0.1   ]
1.0
1.0
1.0
1.0
Propensity function per reaction:
 [0.0016 0.0001 0.1   ]
1.0
1.0
2.0
1.0
Propensity function per reaction:
 [0.0016 0.0001 0.1   ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...