我在另一个页面(见https://stackoverflow.com/questions/23767260/matricial-operation-in-python)中开始讨论矩阵运算问题。首先,我认为问题可能与操作本身有关,但现在我改变了主意。我想我找到了问题所在。请看下面的代码(我自己做的pyepidsis库)
import pyepidsis as pesis
import networkx as nx
###### PARAMETROS DE ENTRADA #########
ns = 5 #numero inicial de agentes susceptiveis (0)
ni = 2 #numero inicial de agentes infectados (1)
b = 0.01 #probabilidade de um agente susceptivel se tornar infectado
g = 0 #probabilidade de um agente infectado se tornar susceptivel
top = nx.fast_gnp_random_graph(ns+ni,1) #topologia utilizada na dinamica
it = 10 #numero de iteracoes
rep = 2 #numero de repeticoes
######## SIMULACAO NUMERICA ##########
E = pesis.distribuicao_aleatoria(ns,ni)
T = nx.adjacency_matrix(top) #matriz de adjacencia da topologia
suscep = [] #lista que guarda o numero de cada agente de cada
infec = [] #iteracao e cada repeticao
suscep_medio = [] #lista que guarda o valor medio de
infec_medio = [] #cada agente a cada iteracao
for i in range(rep):
print E
qtde_suscep = pesis.dinamica(ni,ns,E,T,it,b,g)
suscep.append(qtde_suscep)
当我运行此脚本时,矩阵E
的值会在每个i循环中发生变化。我想解决它,所以保持E不变。有人能在这里找到问题吗?
我一直试图将此问题调试一周。我真的不知道该怎么办。以下代码显示pesis.dinamica
执行的操作
def dinamica(ni,ns,E_aux,T,it,b,g):
qtde_suscep = [] #listas que guardarao o numero de cada
qtde_infec = [] #tipo de agente a cada iteracao
qtde_suscep.append(ns) #numero de susceptiveis e
qtde_infec.append(ni) #infectados no inicio da dinamica
contador = range(ni+ns)
for j in range(1,it):
B = matriz_si(ni+ns,b)
G = matriz_is(ni+ns,g)
np.random.shuffle(contador)
for k in contador:
E_aux[k,0] = interacao(k,E_aux,B[k,:],G[k,0],T[k,:])
contador_suscep=np.where(E_aux==0)[0] #conta quantos
contador_suscep=np.array(contador_suscep) #susceptiveis ha
contador_suscep=len(contador_suscep[0]) #na populacao e
qtde_suscep.append(contador_suscep) #guarda essa
qtde_infec.append((ni+ns) - qtde_suscep[-1]) #informacao
return qtde_suscep
答案 0 :(得分:1)
您正在修改E
E_aux[k,0] = interacao(k,E_aux,B[k,:],G[k,0],T[k,:])
如果E是一个numpy数组(或其他类型的可变对象),它将作为引用传递,并且所有修改都将被传递。解决方案?把它放在函数的开头(只有其中一个):
E_aux = E_aux.copy() # Assuming Numpy array or
E_aux = copy.copy(E_aux) # Assuming it is something else, using stdlib copy
您正在创建数据的全新副本。它将在本地范围内并在退出函数时死亡。原始E_aux
将保持不变。
Python的行为的原因是,如果你有一个非常大的数组(比如4 GB)并且你每次将它传递给一个函数时都复制了,你的内存使用量会翻倍,你会有等待所有数据被复制。