Рассмотрим массив длины n
:удалить элементы с низкой частотой
y=np.array([1,1,1,1,2,2,2,3,3,3,3,3,2,2,2,2,1,4,1,1,1])
и матрицу X
размером n
х m
.
Я хочу удалить предметы из y
и строки X
, для которых соответствующее значение y
имеет низкую частоту.
Я понял, что это даст мне значения y
, которые должны быть удалены:
>>> items, count = np.unique(y, return_counts=True)
>>> to_remove = items[count < 3] # array([4])
и это удалить бы элементы:
>>> X=X[y != to_remove,:]
>>> y=y[y != to_remove]
array([1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1])
Хотя приведенный выше код работает, когда есть только одна метка для удаления, она терпит неудачу, когда имеется несколько значений y
с низкой частотой (то есть y=np.array([1,1,1,1,2,2,2,3,3,3,3,3,2,2,2,2,1,4,1,1,1,5,5,1,1])
приведет к тому, что to_remove
будет array([4, 5])
):
>>> y[y != to_remove,:]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: too many indices for array
Как исправить это в сжатой форме?
Вы решили использовать 'np.in1d (idx, np.where (count> = 3) [0])' вместо 'np.in1d (y, items [count> = 3])' for особая причина? например представление? – fferri
@mescalinum Функционально эти два являются одними и теми же, но один индексируется в 'items', который имеет меньший размер данных, чем' y', а один - в 'idx', который уже имеет тот же размер, что и' y'. Было бы интересно проверить производительность и память. – Divakar
@mescalinum Добавил несколько тестов производительности, взгляните! – Divakar