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

时间:2019-07-24 14:01:08

标签: python numpy

我有以下<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)

3 个答案:

答案 0 :(得分:2)

您可以使用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)]

答案 1 :(得分:2)

您可以在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]

答案 2 :(得分:0)

您可以使用快速的熊猫。

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)]