Dicakar
的答案以结构化数组形式呈现:
In [500]: x=np.array([(25, 1), (37, 3), (37, 2), (47, 1), (59, 2)], dtype=[('recod', '<u8'), ('count', '<u4')])
查找唯一值并计算重复值:
In [501]: unqA, idx=np.unique(x['recod'], return_inverse=True)
In [502]: cnt = np.bincount(idx, x['count'])
创建一个新的结构化数组,并填充字段:
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的空数组,然后循环遍历dtype字段。recarray只是一个专门的数组子类包装器中的结构化数组。
有两种方法可以填充结构化数组(特别是具有多样化dtype)-使用元组列表(如您使用的x),以及逐个字段填充。
array([(2, 3), (2, 8), (4, 1)], dtype=[('recod', '<u8'), ('count', '<u4')])
。您现有的问题看起来更像是一个二维数组。 - hpaulj