Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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 按Numpy中位数分组(不含熊猫)_Python_Numpy_Group By_Median - Fatal编程技术网

Python 按Numpy中位数分组(不含熊猫)

Python 按Numpy中位数分组(不含熊猫),python,numpy,group-by,median,Python,Numpy,Group By,Median,在不使用pandas(并将我的数据保存在Numpy数组中)的情况下,是否可以基于另一列的分组计算一列的中位数 例如,如果这是输入: arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]]) 我想将其作为输出(使用第一列进行分组,然后取第二列的中值: ans = np.array([[0,2],[1,5]]) 如果出于某种原因希望避免使用Pandas,这里有一种计算方法。请注意,在一般情况下,中位数不是整数值(除非将其四舍五入或四舍五入),因为

在不使用pandas(并将我的数据保存在Numpy数组中)的情况下,是否可以基于另一列的分组计算一列的中位数

例如,如果这是输入:

arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]])
我想将其作为输出(使用第一列进行分组,然后取第二列的中值:

ans = np.array([[0,2],[1,5]])

如果出于某种原因希望避免使用Pandas,这里有一种计算方法。请注意,在一般情况下,中位数不是整数值(除非将其四舍五入或四舍五入),因为对于偶数大小的组,它将是两个最中间元素的平均值,因此不能在单个常规数组中同时包含整数组id和中值(尽管可以在结构化数组中)

将numpy导入为np
def分组平均值(组,值):
#按组和值排序
s=np.lexsort([值,组])
arr2=arr[s]
组2=组[s]
值2=值[s]
#寻找群体边界
w=np.flatnonzero(np.diff(组2,前置=group2[0]-1,追加=group2[-1]+1))
#每组的大小
wd=np.差异(w)
#每组中点
m1=w[:-1]+wd//2
m2=m1-1+(wd%2)
#组id
组_res=组2[m1]
#组中值
value_res=(value2[m1]+value2[m2])/2#对int结果使用`//2`或四舍五入
返回组\u res,值\u res
#试验
arr=np.数组([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]]
组分辨率,值分辨率=分组中值(arr[:,0],arr[:,1])
#印刷品
对于zip中的g,v(组,值):
打印(g,v)
# 0 2.0
# 1 5.0
#作为结构化数组
res=np.empty(group_res.shape,dtype=[('group',group_res.dtype),
(“中位数”,值\资源数据类型)])
res['group']=group\U res
res['median']=值
打印(res)
# [(0, 2.) (1, 5.)]

wow好吧,也许我会把它转换成一个数据帧。thanks@lara_toff.这是非常有效的。将它粘贴到某个函数中,然后忘记实现。我会将
w=np.where(group[:-1]!=group[1:])[0]
写成
w=np.flatnonzero(np.diff(group,prepend=group[0]-1,append=group[-1]+1))
。然后下一行就消失了。好的,我会尝试编辑前面的评论