python矩阵不保存其值

时间:2014-05-22 14:51:42

标签: python matrix return-value

我在另一个页面(见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

1 个答案:

答案 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)并且你每次将它传递给一个函数时都复制了,你的内存使用量会翻倍,你会有等待所有数据被复制。