2024-10-01 05:02:49 发布
网友
我有一个按第一列排序的Numpy结构化数组:
x = array([(2, 3), (2, 8), (4, 1)], dtype=[('recod', '<u8'), ('count', '<u4')])
我需要合并记录(将第二列的值相加),其中
在这种情况下,期望的输出将是:
x = array([(2, 11), (4, 1)], dtype=[('recod', '<u8'), ('count', '<u4')])
最好的办法是什么?在
Dicakar's结构化数组形式的答案转换:
Dicakar's
In [500]: x=np.array([(25, 1), (37, 3), (37, 2), (47, 1), (59, 2)], dtype=[('recod', '<u8'), ('count', '<u4')])
查找唯一值并计数:
创建一个新的结构化数组并填充字段:
In [503]: x1 = np.empty(unqA.shape, dtype=x.dtype) In [504]: x1['recod'] = unqA In [505]: x1['count'] = cnt In [506]: x1 Out[506]: array([(25, 1), (37, 5), (47, 1), (59, 2)], dtype=[('recod', '<u8'), ('count', '<u4')])
有一个recarray函数,它从数组列表生成数组:
recarray
In [507]: np.rec.fromarrays([unqA,cnt],dtype=x.dtype) Out[507]: rec.array([(25, 1), (37, 5), (47, 1), (59, 2)], dtype=[('recod', '<u8'), ('count', '<u4')])
在内部它也做同样的事情-构建一个大小和数据类型正确的空数组,然后在dtype字段上循环。重排只是特殊数组子类包装器中的结构化数组。在
有两种方法可以填充结构化数组(尤其是使用不同的数据类型)-使用元组列表填充,就像使用x填充一样,还有逐字段填充。在
x
您可以使用^{}为第一列中的每个元素获取一个ID数组,然后使用^{}根据ID对第二列元素执行累积
In [140]: A Out[140]: array([[25, 1], [37, 3], [37, 2], [47, 1], [59, 2]]) In [141]: unqA,idx = np.unique(A[:,0],return_inverse=True) In [142]: np.column_stack((unqA,np.bincount(idx,A[:,1]))) Out[142]: array([[ 25., 1.], [ 37., 5.], [ 47., 1.], [ 59., 2.]])
您可以使用^{}和{a4}的组合来避免{},这可能会有所帮助,因为{}也会在内部进行排序,在这种情况下不需要这样做,因为输入数据已经被排序了。实现应该是这样的-
^{}使此类型的"group-by" operation微不足道:
In [285]: import pandas as pd In [286]: x = [(25, 1), (37, 3), (37, 2), (47, 1), (59, 2)] In [287]: df = pd.DataFrame(x) In [288]: df Out[288]: 0 1 0 25 1 1 37 3 2 37 2 3 47 1 4 59 2 In [289]: df.groupby(0).sum() Out[289]: 1 0 25 1 37 5 47 1 59 2
如果这是您唯一需要的操作,您可能不希望依赖于pandas,但是一旦开始,您可能会在库中找到其他有用的部分。在
Dicakar's
结构化数组形式的答案转换:查找唯一值并计数:
^{pr2}$创建一个新的结构化数组并填充字段:
有一个
recarray
函数,它从数组列表生成数组:在内部它也做同样的事情-构建一个大小和数据类型正确的空数组,然后在dtype字段上循环。重排只是特殊数组子类包装器中的结构化数组。在
有两种方法可以填充结构化数组(尤其是使用不同的数据类型)-使用元组列表填充,就像使用
x
填充一样,还有逐字段填充。在您可以使用^{} 为第一列中的每个元素获取一个ID数组,然后使用^{} 根据ID对第二列元素执行累积
您可以使用^{} 和{a4}的组合来避免{},这可能会有所帮助,因为{}也会在内部进行排序,在这种情况下不需要这样做,因为输入数据已经被排序了。实现应该是这样的-
^{pr2}$^{} 使此类型的"group-by" operation微不足道:
如果这是您唯一需要的操作,您可能不希望依赖于pandas,但是一旦开始,您可能会在库中找到其他有用的部分。在
相关问题 更多 >
编程相关推荐