如何计算numpy数组中每个项的出现次数

2024-09-29 22:00:05 发布

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

我有下面的<type 'numpy.ndarray'>

array_element = [('T10', 'R1T0') ('T20', 'R2T0') ('T31', 'R3T1') ('T21', 'R2T1')
 ('T10', 'R1T0') ('T20', 'R2T0')]

我想用这样的方式计算array_element中出现的元素的数量:

('T10', 'R1T0')('T20', 'R2T0')重复两次,因此最终输出:

array_element_count = [('T10', 'R1T0', 2) ('T20', 'R2T0', 2) ('T31', 'R3T1', 1) 
('T21', 'R2T1', 1)]

因为array_element是使用numpy创建的:

dt = np.dtype([('x', np.str_, 16), ('y', np.str_, 16)])
array_element = np.zeros((len(strs),), dtype=dt)

我在计算将存储在此数组中的每个项的出现次数时遇到问题:

dt = np.dtype([('x', np.str_, 16), ('y', np.str_, 16), , ('z', np.int32)])
array_element_count = np.zeros((len(strs),), dtype=dt)

Tags: numpynpdtelementarraydtypestrt10
3条回答

您可以在numpy中使用“unique”属性。你知道吗

array_element = np.array([('T10', 'R1T0'), ('T20', 'R2T0'), ('T31', 'R3T1'), ('T21', 'R2T1'),
 ('T10', 'R1T0'), ('T20', 'R2T0')])
uniq_array,count_array = np.unique(array_element,axis=0, return_counts=True)

然后你就能得到答案。你知道吗

print (uniq_array)
print (count_array)

[['T10' 'R1T0'] ['T20' 'R2T0'] ['T21' 'R2T1'] ['T31' 'R3T1']]

[2 2 1 1]

您可以使用collections.Counter方法计算发生次数,然后合并到现有元组:

[k + (v,) for k, v in Counter(array_element).items()]

示例

from collections import Counter

array_element = [('T10', 'R1T0'), ('T20', 'R2T0'), ('T31', 'R3T1'), ('T21', 'R2T1'),
 ('T10', 'R1T0'), ('T20', 'R2T0')]

print([k + (v,) for k, v in Counter(array_element).items()])
# [('T10', 'R1T0', 2) ('T20', 'R2T0', 2) ('T31', 'R3T1', 1) ('T21', 'R2T1', 1)]

你可以用熊猫,它很快。你知道吗

import pandas as pd

array_element = [('T10', 'R1T0'), ('T20', 'R2T0'), ('T31', 'R3T1'),
                 ('T21', 'R2T1'), ('T10', 'R1T0'), ('T20', 'R2T0')]
k = pd.Index(tuple(array_element)).value_counts()
list(zip(k.index, k))

出去

[(('T10', 'R1T0'), 2),
 (('T20', 'R2T0'), 2),
 (('T31', 'R3T1'), 1),
 (('T21', 'R2T1'), 1)]

或者另一个只有numpy的解决方案:

b = np.unique(array_element,return_counts=True, axis=0)
list(zip(zip(*b[0].T.tolist()), b[1]))

出去

[(('T10', 'R1T0'), 2),
 (('T20', 'R2T0'), 2),
 (('T21', 'R2T1'), 1),
 (('T31', 'R3T1'), 1)]

相关问题 更多 >

    热门问题