Удалить строку двумерного массива, если второй элемент не является дубликатом - PullRequest
0 голосов
/ 05 июля 2018

У меня есть такой массив:

a = [['I05', 'U13', 4],
     ['I12', 'U13', 5],
     ['I22', 'U13', 3],
     ['I03', 'U15', 5],
     ['I14', 'U23', 5],
     ['I12', 'U23', 2],
     ['I15', 'U43', 5]]

Здесь у нас есть две записи для U13 и три записи для U23. Поэтому мне нужно сохранить эти массивы и удалить остальные.

Я хочу получить такой результат после удаления:

a = [['I05', 'U13', 4],
     ['I12', 'U13', 5],
     ['I22', 'U13', 3],
     ['I14', 'U23', 5],
     ['I12', 'U23', 2]]

Как это сделать эффективно?

Массивы уже отсортированы во втором столбце (значения 'UXX').

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Этот метод должен достичь желаемого результата:

import numpy as np
from collections import Counter

a = np.array([['I05', 'U13', 4],
              ['I12', 'U13', 5],
              ['I22', 'U13', 3],
              ['I03', 'U15', 5],
              ['I14', 'U23', 5],
              ['I12', 'U23', 2],
              ['I15', 'U43', 5]])

# counts number of occurrences of each value in second column
d = Counter(a[:,1])

# creates an index where these counts are > 1
index_keep = [i for i, j in enumerate(a[:,1]) if d[j] > 1]

print(a[index_keep])

>>> [['I05' 'U13' '4']
     ['I12' 'U13' '5']
     ['I22' 'U13' '3']
     ['I14' 'U23' '5']
     ['I12' 'U23' '2']]
0 голосов
/ 05 июля 2018

Для смешанных типов 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')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...