Как применить функцию NumPy к двумерному массиву, но используя только один цикл - PullRequest
0 голосов
/ 30 октября 2018

У меня есть двумерный массив кортежей, и мне нужно применить функцию 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, не вкладывая два цикла или имея более одного цикла для всей итерации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...