Python 更新数组字典

0 投票
1 回答
693 浏览
提问于 2025-04-17 17:47

我有一个空的 'numpy.ndarray',需要更新。

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.]])}

我想用字典里的新值更新每个网格(这会在一个循环中进行)。比如说:当 dy = 0, dx = 0,最大值 = 100,最小值 = 50,平均值 = 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,但是对于最大值和最小值,更新后的值也是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 个回答

1

正如我在上一个问题的评论中提到的,你可能想用

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

而不是

for arg in parse:
    grid_stat[arg] = my_grid

这样做会把grid_stat的每个值都设置为同一个数组,也就是叫my_grid的那个数组。这样并不会创建三个独立的、形状和内容都一样的数组。你可以通过使用idis来确认这一点:

>>> 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

等等。

撰写回答