在Numpy结构化数组中合并记录

2024-10-01 05:02:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个按第一列排序的Numpy结构化数组:

x = array([(2, 3), (2, 8), (4, 1)], dtype=[('recod', '<u8'), ('count', '<u4')])

我需要合并记录(将第二列的值相加),其中

^{pr2}$

在这种情况下,期望的输出将是:

x = array([(2, 11), (4, 1)], dtype=[('recod', '<u8'), ('count', '<u4')])

最好的办法是什么?在


Tags: numpy排序count记录情况数组array结构化
3条回答

Dicakar's结构化数组形式的答案转换:

In [500]: x=np.array([(25, 1), (37, 3), (37, 2), (47, 1), (59, 2)], dtype=[('recod', '<u8'), ('count', '<u4')])

查找唯一值并计数:

^{pr2}$

创建一个新的结构化数组并填充字段:

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函数,它从数组列表生成数组:

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填充一样,还有逐字段填充。在

您可以使用^{}为第一列中的每个元素获取一个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}的组合来避免{},这可能会有所帮助,因为{}也会在内部进行排序,在这种情况下不需要这样做,因为输入数据已经被排序了。实现应该是这样的-

^{pr2}$

^{}使此类型的"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,但是一旦开始,您可能会在库中找到其他有用的部分。在

相关问题 更多 >