Я пытаюсь умножить два массива вместе поэлементно
expected_state = np.array([-1.004 0.002 0.0])
b = np.array([[1.0, 0.0, 0.0], [[stoch_rate[1]*(2*(popul_num[0]) - 1)/2], 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.4, 0.0]])
Каждый элемент expected_state
должен быть умножен на каждый элемент из каждой строки в b
Итак [[-1.004*1.0, 0.002*0.0, 0.0*0.0], [-1.004*[stoch_rate[1]*(2*(popul_num[0]) - 1)/2], 0.002*0.0....etc]]
Массив b
определен в функции, так что первый элемент во второй строке может изменяться как stoch_rate
и popul_num
при выполнении программы.
def update_matrix(popul_num, stoch_rate):
"""Specific to this model
will need to change if different model
implements equaiton 24 of the Gillespie paper"""
b = np.array([[1.0, 0.0, 0.0], [[stoch_rate[1]*(2*(popul_num[0]) - 1)/2], 0.0, 0.0], [0.0, 0.5,
0.0], [0.0, 0.4, 0.0]])
return b
До сих пор я использовал вложенные циклы for, чтобы попытаться произвести умножение:
for j in range(len(evaluate_propensity)):
for i in range(len(popul_num)):
denominator[j] += (exptd_state_array[i]*b[j, i]) # TypeError: Cant multiply sequence by non-int type "numpy.float64"
Но получите TypeError: can't multiply sequence by non-int of type 'numpy.float64'
Я просмотрел некоторые другие сообщения, в которых говорится, что такие вещи происходят при попытке умножить индексы списка на нецелые числа, потому что индексы списка не могут иметь частичные числа. Что я понимаю, но элементы моих массивов должны быть плавающими, поэтому я не слишком уверен, как это преодолеть.
Затем, прочитав еще немного, я обнаружил, что ошибка возникла, когда программа пыталась произвести умножение элемента [stoch_rate[1]*(2*(popul_num[0]) - 1)/2]
из массива b
, и мне было интересно, будет ли TypeError
происходить из этого элемент массива, производный от формулы, и если да, то как это можно исправить?
Ура
РЕДАКТИРОВАТЬ:
popul_num = np.array([1.0E5, 0, 0]) # array of molecule numbers for 3 species in model
stoch_rate = np.array([1.0, 0.002, 0.5, 0.04]) # rates of the 4 reactions in the model
evaluate_propensity = np.array(a, b, c, d) # An array of the probability of each reaction occuring, is dynamically calculated on each iteration so isn't hard coded.
exptd_state_array and expected_state are the same thing sorry forgot to change the short hand
1 ответ
popul_num = np.array([1.0E5, 0, 0]) # array of molecule numbers for 3 species in model
stoch_rate = np.array([1.0, 0.002, 0.5, 0.04]) # rates of the 4 reactions in the model
evaluate_propensity = np.array((.25,.25,.25,.25)) # An array of the probability of each reaction occuring, is dynamically calculated on each iteration so isn't hard coded.
denominator = np.zeros(4,)
expected_state = np.array([-1.004, 0.002, 0.0])
exptd_state_array = expected_state
b = np.array([[1.0, 0.0, 0.0], [[stoch_rate[1]*(2*(popul_num[0]) - 1)/2], 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.4, 0.0]])
b
array([[1.0, 0.0, 0.0],
[list([199.999]), 0.0, 0.0],
[0.0, 0.5, 0.0],
[0.0, 0.4, 0.0]], dtype=object)
Итак, b имеет смешанные типы. Список создается с помощью квадратных скобок вокруг [stoch_rate[1]*(2*(popul_num[0]) - 1)/2]
Умножение для списков определяется как соединение с самим собой: 3 * [5] = [5, 5, 5]
. Это не удается с поплавками, как указал @hpaulj в комментарии.
Без квадратных скобок:
b = np.array([[1.0, 0.0, 0.0], [stoch_rate[1]*(2*(popul_num[0]) - 1)/2, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.4, 0.0]])
b
array([[ 1. , 0. , 0. ],
[199.999, 0. , 0. ],
[ 0. , 0.5 , 0. ],
[ 0. , 0.4 , 0. ]])
Затем двойной цикл выполняет
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.