Python 按组ID进行Numpy数组规范化:
假设数据和标签为numpy数组,如下所示:Python 按组ID进行Numpy数组规范化:,python,numpy,data-analysis,Python,Numpy,Data Analysis,假设数据和标签为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。我希望基于组ID对标签进行规范化(参见下面的示例): 例如,数据中的前两行id=0;因此,其标签必须: norm
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。我希望基于组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函数来执行此任务。任何建议都将不胜感激 我发现了这种微妙的方法,可以将
标签
转换为组的总和,与索引=[n[0]表示数据中的n]
有关。在以后的解决方案中,不需要使用数据
:
indices = [n[0] for n in data]
u, inv = np.unique(indices, return_inverse=True)
bincnt = np.bincount(inv, weights=labels)
sums = bincnt[inv]
现在的和是:数组([10,10,20,20,20.])
。更简单的是:
normalized_labels = labels / sums
备注。
np.bincount
计算标记为0、1、2。。。这就是为什么需要重新索引索引->库存。例如,索引=[8,6,4,3,4,6,8,8]
应映射到inv=[3,2,1,0,1,2,3,3]
数据项的大小不平衡。还好吗?是的,不平衡。数据中的每一行都有不同的长度。在这种情况下,矢量化的解决方案是不可能的。我会使用index=[n[0]表示数据中的n]
来提取所需的索引。完成后,数据
变量可以省略,进一步的解决方案可以矢量化。感谢您的评论。