У меня есть массив y
, состоящий из 0
и 1
, но с другой частотой.
Например:
y = np.array([0, 0, 1, 1, 1, 1, 0])
И у меня есть массив x
одинаковой длины.
x = np.array([0, 1, 2, 3, 4, 5, 6])
Идея состоит в том, чтобы отфильтровать элементы, пока не будет одинаковое количество 0
и 1
.
. удалить индекс 5:
x = np.array([0, 1, 2, 3, 4, 6])
y = np.array([0, 0, 1, 1, 1, 0])
Наивный метод, о котором я могу подумать, - это получить разницу между частотой значений y (в данном случае 4-3=1
), создать маску для y == 1
и переключить случайные элементы. от True
до False
до разницы 0
. Затем создайте маску для y == 0
, сделайте между ними OR
и примените ее как к x
, так и к y
.
Это не кажется лучшим способом "python / numpy" "делать это хотя.
Есть предложения? Что-то вроде случайного выбора n
элементов из наибольшего числа, где n
- это число самого низкого значения.
Если это проще с pandas, то это будет работать и для меня.
Наивный алгоритм, предполагающий 1> 0:
mask_pos = y == 1
mask_neg = y == 0
pos = len(y[mask_pos])
neg = len(y[mask_neg])
diff = pos-neg
while diff > 0:
rand = np.random.randint(0, len(y))
if mask_pos[rand] == True:
mask_pos[rand] = False
diff -= 1
mask_final = mask_pos | mask_neg
y_new = y[mask_final]
x_new = x[mask_final]
Этот наивный алгоритм действительно медленный