Как заставить цикл выводить правильные размеры массива?

#python #python-3.x #loops #for-loop

Вопрос:

В моем цикле у меня есть три разные переменные, которые мне нужно вывести: A, среднее значение V и Альфа. Раньше я получал только одно значение для каждого, но исправил это с помощью функции добавления.

 An=np.array([51,101,201,301,501])#No. agents
t=10#time steps
MM=3#agent memory
r=5#repetitions
A=np.array([])
V=np.array([])
Alpha=np.array([])
Vav=np.array([])
for agentcount in np.arange(0,5): #count over agents
    N=An[agentcount]

    for M in np.arange(1,MM 1):
        for crep in np.arange(1,r 1): 
             win=(np.random.rand(M,1)>0.5).astype(int) #winning record 
             s1=(np.random.rand(2**M,N)>0.5).astype(int) #random strat
             s2=(np.random.rand((2**M),N)>0.5).astype(int) #alternative 
             payout=np.zeros([2,N])#empty payout record
             for tc in np.arange(1,t 1):
                  cc=np.abs((1  np.dot((2**(np.arange(0,M))),win)))
                  nex1=s1[cc-1,:].reshape(501)
                  nex2=s2[cc-1,:].reshape(501)
                  nexts=np.stack((nex1,nex2),axis=0)
    
                  for cn in np.arange(0,N 1): #better strat
                      if (payout[0,cn-1]>payout[1,cn-1]):
                          Next=nex1
                      else:
                          Next=nex2
                  Asum=np.sum(Next)/N
                  A=np.append(A,Asum)
                  winning=(A<0.5).astype(int)
                  winning=np.transpose(winning)
                  payout=payout (nexts==winning)#update record
              V=np.append(V,np.var(A))
              Vav=np.append(Vav,np.mean(V))
          Alpha=np.append(Alpha,2**M/N)
 

Используя отступы, я бы ожидал, что A, Vav и Alpha будут иметь размер 1d массивов t, r и ММ соответственно. Но для A я получаю размер t r ММ и размер Vav r*ММ. Как мне получить размеры, соответствующие определенным участкам петли?
Спасибо

Комментарии:

1. Что-то не так с углублениями. Следующие строки for crep in np.arange(1,r 1): должны быть с отступом 1 уровень… Не могли бы вы это исправить? Не уверен, какие отступы запланированы для последних трех строк.

Ответ №1:

Я не совсем уверен, чего вы добиваетесь. Но когда вы инициализируете A Vav и Alpha выходите за пределы своих циклов и добавляете значение во время каждого прохода , длина массива соответствует ожиданиям. Я надеюсь, что упрощение вашего кода прояснит некоторые вещи:

 An=np.array([51,101,201,301,501])#No. agents
t=10#time steps
MM=3#agent memory
r=5#repetitions
A=np.array([])
V=np.array([])
Alpha=np.array([])
Vav=np.array([])
for agentcount in np.arange(0,5): #count over agents
    for M in np.arange(1,MM 1):
        for crep in np.arange(1,r 1): 
             for tc in np.arange(1,t 1):
                  A=np.append(A,'Asum')
             V=np.append(V,'np.var(A)')
             Vav=np.append(Vav,'np.mean(V)')
        Alpha=np.append(Alpha,'2**M/N')
 

Например, значение добавляется Vav r -раз во время каждого MM прохода внешнего цикла.

Чтобы получить (например) массив A длины t , потребуется инициализировать A его непосредственно перед циклом t . Но это означало A бы, что каждый раз это перезаписывается… (и это, вероятно, не подразумевается?)

Комментарии:

1. Спасибо, я все еще в замешательстве, потому что в Matlab код A(tc)=np.сумма(Следующая)/N повторит сумму tc раз и даст массив размером tc. Как бы я сделал это на python? A[ct]=» выдаст ошибку