2013-03-03 3 views
0

У меня есть пустой «numpy.ndarray» для обновления.Python обновляет словарь массива

import numpy as np 
my_grid = np.zeros((5, 5)) 

# stat 
parse = "max","min","avg" 

# create a dictionary for each element of parse 
grid_stat = {} 
for arg in parse: 
    grid_stat[arg] = my_grid 


grid_stat 
{'avg': array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]), 
'max': array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]), 
'min': array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]])} 

Я хочу обновить с новым значением каждой сетки в словаре (это будет частью цикла) например: on dy = 0, dx = 0, max= 100, min= 50, avg = 75

grid_stat 
    {'avg': array([[ 75., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.]]), 
    'max': array([[ 100., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.]]), 
    'min': array([[ 50., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.], 
      [ 0., 0., 0., 0., 0.]])} 

я попробовал простое решение

grid_stat['avg'][0,0] = 100 но также для max и min значение обновлено 100

grid_stat 
{'avg': array([[ 100., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]), 
'max': array([[ 100., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]), 
'min': array([[ 100., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]])} 

ответ

1

Как я предложил в комментариях к последнему вопросу, вы, вероятно, хотите использовать

for arg in parse: 
    grid_stat[arg] = my_grid.copy() 

вместо

for arg in parse: 
    grid_stat[arg] = my_grid 

множеств, каждое значение grid_stat к тот же массив, называемый my_grid , Он не создает три отдельных массива одинаковой формы и содержимого. Вы можете подтвердить это с помощью id или is:

>>> id(my_grid) 
4325774752 
>>> id(grid_stat['max']) 
4325774752 
>>> id(grid_stat['avg']) 
4325774752 
>>> id(grid_stat['min']) 
4325774752 
>>> my_grid is grid_stat['max'] 
True 
>>> grid_stat['max'] is grid_stat['avg'] 
True 

т.д.

+0

Спасибо DSM, но жаль, что я did't получить предложение для моей проблемы. –

+1

@Gianni: не используйте 'grid_stat [arg] = my_grid'. Используйте 'grid_stat [arg] = my_grid.copy()'. – DSM

+0

Он работает, спасибо. Извините, если я спрашиваю о .copy() и почему он работает с использованием копии? (мне нужно улучшить свои навыки) –

Смежные вопросы