字典条目都是一样的

Posted

技术标签:

【中文标题】字典条目都是一样的【英文标题】:Dictionary entries are all the same 【发布时间】:2022-01-23 04:53:04 【问题描述】:

我正在使用嵌套循环来填充字典中的条目。字典中的每个条目都包含一个 Numpy 数组。每个 Numpy 数组包含三个值。

每个字典条目都应该包含一个唯一的 Numpy 数组,但是当脚本运行时,所有 169 个字典条目都被完全相同的 Numpy 数组填充。每一个都应该不同。尝试调试后,我意识到重复的条目实际上是条目#168(最后一个)的正确值。

我不是为什么会发生这种情况,因为命令 print(IC_sub_units) 在 I/O 控制台中输出正确的值,但是当我尝试将它们存储在字典中时,所有条目都相同。我猜问题出在最后一段代码中:IC_units[i] = IC_sub_units

我已经连续几个小时试图解决这个问题。这可能是一件非常简单的事情。有什么想法吗?

# Determining incremental costs (rise/run)
IC_sub_units = np.zeros(3)
IC_units = 
for i in range(169):
    for j in range(1, 4):
        IC_sub_units[j-1] = (y[i][j]-y[i][j-1])/(x[i][j]-x[i][j-1])
    print(IC_sub_units)
    IC_units[i] = IC_sub_units

打印 IC_units 会为字典条目 0 到 168 生成以下输出。下面显示的值是条目 168 的正确值,但由于某种原因,它出现在每个字典条目中。

 157: array([40.83088018, 42.50615291, 44.18142564]),
 158: array([40.83088018, 42.50615291, 44.18142564]),
 159: array([40.83088018, 42.50615291, 44.18142564]),
 160: array([40.83088018, 42.50615291, 44.18142564]),
 161: array([40.83088018, 42.50615291, 44.18142564]),
 162: array([40.83088018, 42.50615291, 44.18142564]),
 163: array([40.83088018, 42.50615291, 44.18142564]),
 164: array([40.83088018, 42.50615291, 44.18142564]),
 165: array([40.83088018, 42.50615291, 44.18142564]),
 166: array([40.83088018, 42.50615291, 44.18142564]),
 167: array([40.83088018, 42.50615291, 44.18142564]),
 168: array([40.83088018, 42.50615291, 44.18142564])

【问题讨论】:

每次循环都需要创建一个新的IC_sub_units。您每次都在更新同一个数组。 【参考方案1】:

只需将IC_sub_units 的定义移到第一个循环中即可:

IC_units = 
for i in range(169):
    IC_sub_units = np.zeros(3)
    for j in range(1, 4):
        IC_sub_units[j-1] = (y[i][j]-y[i][j-1])/(x[i][j]-x[i][j-1])
    print(IC_sub_units)
    IC_units[i] = IC_sub_units

【讨论】:

【参考方案2】:

您不是在每次迭代时都分配一个新数组。在您的示例中,分配发生在 np.zeros 上。调用发生在该行运行时,而不是每次您引用名称 IC_sub_units 时。

要解决此问题,您需要在循环内进行分配。但是,在这种情况下,您不需要调用 np.zeros 或使用嵌套的 for 循环。事实上,根据经验,您应该避免使用 numpy 数组进行显式循环。

以下是如何对计算进行矢量化并一次性分配所需的缓冲区:

IC_units = 
for i in range(169):
    IC_units[i] = np.diff(y[i]) / np.diff(x[i])

你可以这样写:

IC_units = i: np.diff(y[i]) / np.diff(x[i]) for i in range(169)

如果xy 是numpy 数组而不是您的索引所暗示的列表,那么问题就更简单了。您可以预先计算所有斜率:

IC_sub_units = np.diff(y, axis=1) / np.diff(x, axis=1)
IC_units = i: IC_sub_units[i] for i in range(1, 169)

你也可以这样写

dict(zip(range(1, 169), IC_sub_units))

但在这一点上,你应该问问自己是否需要以数字方式索引的内容是否需要在字典中。对于给定的i,使用最后一个定义,IC_sub_units[i - 1] 与字典为i 返回的数组相同。

【讨论】:

以上是关于字典条目都是一样的的主要内容,如果未能解决你的问题,请参考以下文章

用 Pandas 数据框中的行填充嵌套字典

如果字典尚不存在,则将条目添加到字典

保存Python字典时,json为每个条目添加一个字符[重复]

为啥 .Net 字典中的条目要另外排序?

具有相同键的多个条目的字典[重复]

Python中添加字典条目时逗号的作用