Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按组ID进行Numpy数组规范化:_Python_Numpy_Data Analysis - Fatal编程技术网

Python 按组ID进行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

假设数据标签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;因此,其标签必须:

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]
来提取所需的索引。完成后,
数据
变量可以省略,进一步的解决方案可以矢量化。感谢您的评论。