如何调整多层循环使A、Vav、Alpha输出符合预期的数组大小?
问题分析
你当前的数组都在全局作用域初始化,所有循环迭代都会向同一个数组追加数据,因此最终长度是所有外层循环次数的乘积,不符合层级输出要求。
调整方案
根据你需要的数组长度,把不同数组的初始化位置移动到对应上层循环的内部,每次进入对应层级时清空数组,仅存储当前层级的输出:
- A要求长度为t:对应单次重复实验的t个时间步输出,将A的初始化放在
crep循环内部、时间步tc循环外部 - Vav要求长度为r:对应单个M值下r次重复实验的均值输出,将V的初始化放在
M循环内部、crep循环外部 - Alpha要求长度为MM:对应单个N下MM个M值的输出,将Alpha的初始化放在
agentcount循环内部、M循环外部
修正后代码
同时修复了原代码中硬编码reshape维度、索引越界、逻辑判断错误的问题:
import numpy as np An=np.array([51,101,201,301,501])#No. agents t=10#time steps MM=3#agent memory r=5#repetitions for agentcount in np.arange(0,5): #count over agents N=An[agentcount] Alpha = np.array([]) # 每个N对应一个长度为MM的Alpha for M in np.arange(1,MM+1): V = np.array([]) # 每个M对应一个长度为r的V Vav = np.array([]) # 每个M对应一个长度为r的Vav for crep in np.arange(1,r+1): A = np.array([]) # 每个crep对应一个长度为t的A 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(N) # 修正硬编码维度问题 nex2=s2[cc-1,:].reshape(N) nexts=np.stack((nex1,nex2),axis=0) # 去掉冗余的cn循环,直接用payout的均值判断最优策略 if payout[0].mean() > payout[1].mean(): Next = nex1 else: Next = nex2 Asum=np.sum(Next)/N A=np.append(A,Asum) winning=(Asum<0.5).astype(int) # 修正用整个A数组判断的逻辑错误 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) # 此处可打印/存储当前N对应的三个数组结果 print(f"N={N}时,A长度:{len(A)},Vav长度:{len(Vav)},Alpha长度:{len(Alpha)}")
如果不需要遍历不同的代理数量N,可直接去掉最外层的agentcount循环,固定N为你需要的值即可。
内容的提问来源于stack exchange,提问作者Jake2407
相关产品推荐
相关产品推荐

