我正在使用嵌套回圈來填充字典中的條目。字典中的每個條目都包含一個 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])}
uj5u.com熱心網友回復:
只需將 的定義移動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
uj5u.com熱心網友回復:
您不會在每次迭代時分配一個新陣列。分配發生np.zeros在您的示例中。該呼叫發生在該行運行時,而不是每次參考 name 時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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389384.html
