我有 2 個串列,如下所示:
A = [[],[],[],[500,540],[510,560,550],[460,510,600,450]]
B = [[],[],[],[4000,2500],[3500,3600,3000],[3000,2900,3300,3500]]
我想使用 B 的串列作為相應的權重來計算 A 的每個串列中值的加權平均值。我的輸出 C 應該像:
C = [[],[],[],[515],[540],[505]]
到目前為止我嘗試的是使用
C = []
for i in range(len(A)):
avg = np.average(A[i], weights=B[i])
C.append(avg)
非常感謝您的幫助。
uj5u.com熱心網友回復:
到目前為止,您所做的代碼有效,但它不適用于 A 中具有 0 len 的串列。因此,您可以通過以下修改來解釋它:
import numpy as np
A = [[],[],[],[500,540],[510,560,550],[460,510,600,450]]
B = [[],[],[],[4000,2500],[3500,3600,3000],[3000,2900,3300,3500]]
C = []
for i in range(len(A)):
if len(A[i]) > 0:
avg = np.average(A[i], weights=B[i])
C.append(avg)
else:
C.append([])
輸出:
C
Out[10]: [[], [], [], 515.3846153846154, 539.7029702970297, 505.03937007874015]
uj5u.com熱心網友回復:
唯一的問題是weights不能是空串列:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<__array_function__ internals>", line 180, in average
File "site-packages/numpy/lib/function_base.py", line 524, in average
raise ZeroDivisionError(
ZeroDivisionError: Weights sum to zero, can't be normalized
但是,B[:3] == [[], [], []],所以你有三個空重量。
您可以相應地處理這些空串列:
C = []
for i in range(len(A)):
avg = np.average(A[i], weights=B[i]) if B[i] else 0
C.append(avg)
輸出:
C == [0, 0, 0, 515.3846153846154, 539.7029702970297, 505.03937007874015]
uj5u.com熱心網友回復:
這是我最好的解決方案:
import numpy as np
A = [[], [], [], [500, 540], [510, 560, 550], [460, 510, 600, 450]]
B = [[], [], [], [4000, 2500], [3500, 3600, 3000], [3000, 2900, 3300, 3500]]
C = list()
for list_values, list_weights in zip(A, B):
if len(list_values) == 0 or len(list_weights) == 0:
C.append([])
else:
weighted_average = np.average(list_values, weights=list_weights)
C.append(weighted_average)
uj5u.com熱心網友回復:
正如其他人指出的那樣,您需要處理空串列。但是沒有人給你你要求的輸出。其他解決方案也使用計數器(可能反映您自己的代碼),但這通常不被認為是慣用的 Python。
我可能會在串列理解中執行此操作,而不是索引到兩個串列中,我會利用zip().
您說您希望在 1 項串列中使用四舍五入的整數,例如:
C = [[int(np.round(np.average(a, weights=b), 0))] if a else [] for a, b in zip(A, B)]
這將回傳您在問題中指定的內容:
[[], [], [], [515], [540], [505]]
但如果是我,我想我希望結果像浮動一樣:
C = [np.average(a, weights=b) if a else np.nan for a, b in zip(A, B)]
這導致:
[nan, nan, nan, 515.3846153846154, 539.7029702970297, 505.03937007874015]
我個人更喜歡哪個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494392.html
下一篇:為什么變數的值會發生變化?
