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