【问题标题】:How to change only one value in a dictionary of numpy array如何仅更改numpy数组字典中的一个值
【发布时间】:2020-04-02 14:43:22
【问题描述】:

我遇到了一个我认为微不足道的问题。

我有一本包含 2 个条目(模拟)的字典。每个条目是另一个包含 2 个条目(选项)的字典。每个选项都是一个 numpy 数组。

在第一步中,我创建了这些数组,以便每次模拟时它们的形状相同。在下一步中,我只想更改一个值(在示例中:Sim 1Option_1、数组元素[0,0])。

simulations = {"Sim 1" : "Sim a",
               "Sim 2" : "Sim b"}

zero_trips = {"Option_1" : np.zeros((2, 2)),
              "Option_2" : np.zeros((2, 2))}

sim_trips = {}
for sim in simulations:
    sim_trips[sim] = zero_trips

print(sim_trips)
sim_trips["Sim 1"]["Option_1"][0,0] += 1
print(sim_trips)

但由于某种原因,Option_1 数组在每次模拟时都会更改,而不仅仅是模拟 1。

# 1st output
    {'Sim 1': {'Option_1': array([[0., 0.], [0., 0.]]), 
               'Option_2': array([[0., 0.], [0., 0.]])}, 
     'Sim 2': {'Option_1': array([[0., 0.], [0., 0.]]), 
               'Option_2': array([[0., 0.], [0., 0.]])}}

# 2nd output
    {'Sim 1': {'Option_1': array([[1., 0.], [0., 0.]]), 
               'Option_2': array([[0., 0.], [0., 0.]])}, 
     'Sim 2': {'Option_1': array([[1., 0.], [0., 0.]]), 
               'Option_2': array([[0., 0.], [0., 0.]])}}

我做错了什么?有人可以帮忙吗?

我想要的输出如下所示:

        {'Sim 1': {'Option_1': array([[1., 0.], [0., 0.]]), 
                   'Option_2': array([[0., 0.], [0., 0.]])}, 
         'Sim 2': {'Option_1': array([[0., 0.], [0., 0.]]), 
                   'Option_2': array([[0., 0.], [0., 0.]])}}

【问题讨论】:

    标签: python python-3.x numpy dictionary numpy-ndarray


    【解决方案1】:

    您可以为此使用deepcopy。这是因为您将zero_trips 分配给每个模拟,而不是zero_trips 的值。如果您编辑其中一个,所有zero_trips 值都会改变。

    代码:

    from copy import deepcopy
    
    simulations = {"Sim 1" : "Sim a",
                   "Sim 2" : "Sim b"}
    
    zero_trips = {"Option_1" : np.zeros((2, 2)),
                  "Option_2" : np.zeros((2, 2))}
    
    sim_trips = {}
    for sim in simulations:
        sim_trips[sim] = deepcopy(zero_trips)
    
    print(sim_trips)
    sim_trips["Sim 1"]["Option_1"][0,0] += 1
    print(sim_trips)
    

    输出:

    {'Sim 1': {'Option_1': array([[0., 0.], [0., 0.]]), 
               'Option_2': array([[0., 0.], [0., 0.]])}, 
     'Sim 2': {'Option_1': array([[0., 0.], [0., 0.]]),
               'Option_2': array([[0., 0.], [0., 0.]])}}
    
    {'Sim 1': {'Option_1': array([[1., 0.], [0., 0.]]),
               'Option_2': array([[0., 0.], [0., 0.]])}, 
     'Sim 2': {'Option_1': array([[0., 0.], [0., 0.]]),
               'Option_2': array([[0., 0.], [0., 0.]])}}
    

    【讨论】:

    • 你知道为什么这不起作用吗? for sim in simulations: sim_trips[sim] = zero_trips.copy()
    • 因为zero_trips 包含np.zeros((2, 2)),所以即使我们使用copyzero_trips 列表中对数组的引用保持不变。这可以通过使用deepcopy 解决,它也会在zero_trips 中创建元素的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2022-11-22
    相关资源
    最近更新 更多