字典条目都是一样的
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)
如果x
和y
是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
返回的数组相同。
【讨论】:
以上是关于字典条目都是一样的的主要内容,如果未能解决你的问题,请参考以下文章