按组 ID 对 Numpy 数组进行归一化:
Numpy array normalization by group ids:
假设 data 和 labels 是 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])
数据中每行的第一个元素显示一个组的id。我希望规范化(见下面的例子)标签基于group ids:
例如数据的前两行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]
.
假设 data 和 labels 是 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])
数据中每行的第一个元素显示一个组的id。我希望规范化(见下面的例子)标签基于group ids:
例如数据的前两行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]
.