我有以下資料框:
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df:
a b
0 1 3
1 2 4
我有一個樣本大小 N=5。我想使用標準化資料幀中的權重
df.div(df.sum(axis=1), axis=0)
并強制執行約束,使得所有權重都不大于 1/sqrt(N)。
這可以在一行中完成嗎?
uj5u.com熱心網友回復:
要規范化并確保沒有任何值大于參考值,您需要獲取規范化值的最大值并再次規范化:
import numpy as np
N = 5 # 1/np.sqrt(N) = 0.447214
df2 = df.div(df.sum(axis=1), axis=0)
df2 = df2.div(df2.values.max()*np.sqrt(N))
輸出:
a b
0 0.149071 0.447214
1 0.198762 0.397523
這是兩步,兩行,因為第二步依賴于第一步。
你能在一行中完成嗎?是的,但你應該嗎?
通過兩次執行相同的計算:效率低下
N = 5
df2 = df.div(df.sum(axis=1), axis=0).div(df.div(df.sum(axis=1), axis=0).values.max()*np.sqrt(N))
通過使用賦值運算式:不那么可讀
N = 5
df2 = (df2:=df.div(df.sum(axis=1), axis=0)).div(df2.values.max()*np.sqrt(N))
我會堅持這兩行
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371337.html