У меня есть двумерный массив кортежей, и мне нужно применить функцию step
к каждому элементу в пределах 2-го измерения этого массива (к каждому кортежу), , используя только один цикл для всего итерации.
Вот функция, где происходит основная итерация:
import random
import numpy as np
def simulation(SIR0, α, β, days, reps):
arr1 = np.zeros((reps, days, len(SIR0)), dtype=int)
arr1[:,0] = SIR0
t = 1
while 0 < t < days:
arr1[:, t] = step(arr1[0, t-1], α, β)
t += 1
return arr1
Все элементы 2-го измерения являются кортежами с 3 числовыми элементами в них.
SIR0
всегда 0-й кортеж за итерацию в 1-м измерении.
step
- это функция, которая зависит от numpy и генерирует случайные значения для каждого элемента в данном кортеже, функция simulation
отправляет предыдущий кортеж в качестве ссылки в качестве параметра SIR
в каждой итерации.
def step(SIR, α=0.1, β=0.2):
S, I, R = SIR
s_arr = np.random.random(size=S)
s_mask = s_arr[s_arr < α]
S -= s_mask.size
I += s_mask.size
i_arr = np.random.random(size=I)
i_mask = i_arr[i_arr < β]
I -= i_mask.size
R += i_mask.size
SIR = S, I, R
return SIR
Все кортежи, кроме 0-го, должны иметь разные случайные значения в каждой итерации в 1-м измерении, его размер определяется параметром reps
.
Текущая функция выдает одинаковые результаты для каждой итерации в 1-м измерении. (в этом примере reps
равно 2).
[[[100 0 0]
[ 96 3 1]
[ 91 8 1]
[ 82 13 5]
[ 74 16 10]
[ 66 19 15]
[ 62 19 19]
[ 56 21 23]
[ 48 25 27]
[ 45 26 29]]
[[100 0 0]
[ 96 3 1]
[ 91 8 1]
[ 82 13 5]
[ 74 16 10]
[ 66 19 15]
[ 62 19 19]
[ 56 21 23]
[ 48 25 27]
[ 45 26 29]]]
Но 2-й блок кортежей должен иметь немного разные номера. (кроме 0-го кортежа, который всегда [100, 0, 0]
)
Как я могу применить функцию step
для каждого кортежа, в каждой итерации для reps
, не вкладывая два цикла или имея более одного цикла для всей итерации?