[英]Numpy array normalization by group ids:
假設數據和標簽是numpy 數組,如下所示:
import numpy as np
data=np.array([[0,4,5,6,8],[0,6,8,9],[1,9,5],[1,45,7],[1,8,3]]) #Note: length of each row is different
labels=np.array([4,6,10,4,6])
data中每一行的第一個元素顯示一個組的 id 。 我想根據組 id規范化(見下面的例子)標簽:
例如,數據中的前兩行有 id=0; 因此,它們的標簽必須是:
normalized_labels[0]=labels[0]/(4+6)=0.4
normalized_labels[1]=labels[1]/(4+6)=0.6
預期的輸出應該是:
normalized_labels=[0.4,0.6,0.5,0.2,0.3]
我有一個天真的解決方案:
ids=[data[i][0] for i in range(data.shape[0])]
out=[]
for i in set(ids):
ind=np.where(ids==i)
out.extend(list(labels[ind]/np.sum(labels[ind])))
out=np.array(out)
print(out)
是否有任何 numpy 函數來執行這樣的任務。 任何建議表示贊賞!
我發現了這種將labels
轉換為關於indices = [n[0] for n in data]
的組總和的微妙方法。 在后面的解決方案中,不需要使用data
:
indices = [n[0] for n in data]
u, inv = np.unique(indices, return_inverse=True)
bincnt = np.bincount(inv, weights=labels)
sums = bincnt[inv]
現在總和是: array([10., 10., 20., 20., 20.])
。 進一步很簡單,如下所示:
normalized_labels = labels / sums
評論。 np.bincount
計算標記為 0、1、2 的項目的加權總和...這就是為什么需要重新indices -> inv
。 例如, indices = [8, 6, 4, 3, 4, 6, 8, 8]
應該映射到inv = [3, 2, 1, 0, 1, 2, 3, 3]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.