我有一個包含 50 名患者和100 個評分資料點的 numpy 2D 陣列。
scores = array([[7.0, 10.0, 12.0, ..., 0.0],
[0.0, 11.0, 34.0, ..., 1.0],
.
.
.
[0.0, 33.0, 34.0, ..., 50.0]])
每個分數都是一個非負浮點值,將根據范圍條件 {v < 20: 'A', 20 <= v 映射到類別 {a, b, c}(代表輕度、中度、嚴重) <= 50 : 'B', 50 <= v : 'C'}。這可以使用((25 < a) & (a < 100)).sum()as in this thread來完成。
現在我需要每個患者類別,基于最大得分,他獲得,條件是該分配計數的類別的資料點是> =一定的閾值(比如20%)。
例如(以100 個資料點中的20%作為閾值):
- 如果患者 i 得分為25 個資料點的嚴重程度為“C”-> 他被歸類為 C(嚴重)
- 如果患者 i 獲得了15個嚴重程度為“C”的資料點和15個嚴重程度為“B”的資料點 -> 他被歸類為 B(中等)。
有沒有辦法在 numpy 中自動做到這一點?
先感謝您。
更新:
預期輸出應該是格式相同的數字或患者 (50,) 長度的一維陣列
categories = ['A', 'C', 'A', .... 'B'],其中每個值是患者的總體類別。
uj5u.com熱心網友回復:
映射值
您可以使用numpy.select:
scores = np.array([[7.0, 10.0, 12.0, 0.0],
[0.0, 11.0, 34.0, 55],
[55,55,0,44],
])
out = np.select([scores<20, (20<=scores)&(scores<50), 50<=scores],
['A', 'B', 'C'])
輸出:
array([['A', 'A', 'A', 'A'],
['A', 'A', 'B', 'C'],
['C', 'C', 'A', 'B']], dtype='<U3')
獲得最頻繁
這里使用numpy.unique:
categories np.unique(out, axis=1)[:,0]
輸出:
array(['A', 'A', 'C'], dtype='<U3')
uj5u.com熱心網友回復:
我一步完成
data = get_the_data()
data[:, :-1].sort() # sort the data descending along the last dimension.
data_categorized = data[:, 20] # Threshold is 20% at least
# Now I can categorize directly
out = np.select([data<20, (20<=data)&(data<50), 50<=data], ['A', 'B', 'C'])
我沒有對每個資料點進行分類,然后根據至少 20% 的嚴重程度閾值將患者作為一個整體進行分類,而是對陣列進行降序排序,然后將專案編號為 20(滿分 100)。
按降序排序,我確信當我選擇第 20 項時,它之前的所有項都具有相同或更高的嚴重性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/326710.html
