Для смешанных типов Pandas - удобный вариант. Поскольку ваши данные отсортированы, вам нужно хранить только дубликаты:
import pandas as pd
import numpy as np
A = np.array([('I05', 'U13', 4),
('I12', 'U13', 5),
('I22', 'U13', 3),
('I03', 'U15', 5),
('I14', 'U23', 5),
('I12', 'U23', 2),
('I15', 'U43', 5)],
dtype='object, object, i4')
df = pd.DataFrame(A)
B = df[df.duplicated(subset=['f1'], keep=False)].values
print(B)
array([['I05', 'U13', 4],
['I12', 'U13', 5],
['I22', 'U13', 3],
['I14', 'U23', 5],
['I12', 'U23', 2]], dtype=object)
Примечание. NumPy добавляет имена автоматически. Это структурированный массив, а не массив кортежей:
print(A)
array([('I05', 'U13', 4), ('I12', 'U13', 5), ('I22', 'U13', 3),
('I03', 'U15', 5), ('I14', 'U23', 5), ('I12', 'U23', 2),
('I15', 'U43', 5)],
dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i4')])