Numpy массивы неправильно имеют одинаковые значения? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть небольшая программа, в которой я играю с созданием эволюционного алгоритма, связанного с распространением болезней. Я столкнулся с проблемой, которая немного свела меня с ума, пытаясь понять проблему.

У меня есть два массива numpy, «заражений», которые представляют собой массивы, каждый элемент которых представляет собой двоичное представление о том, подвергался ли этот человек воздействию, и «текущие_инфекции», которые являются только текущими инфекциями и должны быть увеличивается на дни.

Например:

инфекции = [0,0,0,1,1]
current_infections = [0,0,0, 15,0]

Это будет представлять пять человек, третий человек болеет заболеванием в течение 15 дней, а четвертый человек болеет достаточно долго, чтобы выздороветь и больше не болеет.


infections = []
current_infections = []
responsible_infections = []
spread_rate = 0.1
contagious_period = 20
initial_node_infections = 2
current_network = #this is an array of adjacency matrices for nodes in a network


#initial infections.
def initialize_infections():
  global infections, current_infections, responsible_infections
  responsible_infections = np.zeros(current_network.shape[0])
  infections = np.zeros(current_network.shape[0])
  for each in rd.sample(range(len(current_network)), k=initial_node_infections):
    infections[each] = 1
  current_infections = infections[:]

# runs a day in simulation. 
# returns 1 if there are still ongoing infections at the end of day, 0 if not
def progress_day():
  global current_infections
  print(np.sum(current_infections), np.sum(infections))  #should not be equivalent, yet they are
  for i in range(len(current_infections)):
    if current_infections[i] >= 1 and current_infections[i]<contagious_period:
      current_infections[i]+=1
    elif current_infections[i]>=contagious_period:
      #patient recovered
      current_infections[i] = 0
  for i in range(contacts_per_day):
    for j in range(len(current_infections)):
      if current_infections[j] >= 1:
        spread_infection(current_network[j], j)

  if not np.sum(current_infections):
    return 0
  else:
    return 1




#given infected node it calculates spread of disease to adjacent nodes.
def spread_infection(person, rp):
  global infections, current_infections, responsible_infections
  for x in range(len(person)):
    if person[x] == 1 and infections[x] == 0 and rd.random()<=spread_rate:
      current_infections[x] = 1
      infections[x] = 1
      responsible_infections[rp]+=1 #infections a given person is responsible for.


def main():
  global current_infections, infections
  initialize_infections()
  day = 0
  while day<100:
    if not progress_day():
      break
    day+=1

main()

По какой-то причине изменения, внесенные в элемент в current_infections, также вносятся в этот элемент в заражениях, поэтому оба они увеличиваются. Я что-то делаю неправильно с numpy, так что это один и тот же массив?

1 Ответ

0 голосов
/ 05 мая 2020

current_infections = infections[:] делает current_infections обзором элементов в заражениях. Используйте current_infections = infections.copy().

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