#arrays
#массивы
Вопрос:
У меня есть массив 2D, называемый X, и массив 1D для классов X, что я хочу сделать, это нарезать одинаковое количество первых N процентных элементов для каждого класса и сохранить внутри нового массива, например, простым способом, не выполняя циклы for:
Для следующего массива X, который является 2D:
[[0.612515 0.385088 ]
[0.213345 0.174123 ]
[0.432596 0.8714246]
[0.700230 0.730789 ]
[0.455105 0.128509 ]
[0.518423 0.295175 ]
[0.659871 0.320614 ]
[0.459677 0.940614 ]
[0.823733 0.831789 ]
[0.236175 0.10750 ]
[0.379032 0.241121 ]
[0.512535 0.8522193]
Вывод равен 3.
Затем я хотел бы сохранить первые 3 индекса, которые принадлежат классу 0, и первые 3 элемента, которые принадлежат классу 0, и сохранить порядок следования индексов, следующий вывод:
Первые 3 из каждого класса: [1 0 0 1 0 1]
New_X =
[[0.612515 0.385088 ]
[0.213345 0.174123 ]
[0.432596 0.8714246]
[0.700230 0.730789 ]
[0.455105 0.128509 ]
[0.518423 0.295175 ]]
Ответ №1:
Во-первых, 30% — это всего 2 элемента из каждого класса (даже при использовании np.ceil
).
Во-вторых, я предполагаю, что оба массива numpy.array
.
Учитывая 2 массива, мы можем найти нужные индексы, используя np.where
массив and y
следующим образом:
in_ = sorted([x for x in [*np.where(y==0)[0][:np.ceil(0.3*6).astype(int)],*np.where(y==1)[0][:np.ceil(0.3*6).astype(int)]]]) # [0, 1, 2, 3]
Теперь мы можем просто нарезать X
вот так:
X[in_]
# array([[0.612515 , 0.385088 ],
# [0.213345 , 0.174123 ],
# [0.432596 , 0.8714246],
# [0.70023 , 0.730789 ]])
Определение X
и y
:
X = np.array([[0.612515 , 0.385088 ],
[0.213345 , 0.174123 ],
[0.432596 , 0.8714246],
[0.70023 , 0.730789 ],
[0.455105 , 0.128509 ],
[0.518423 , 0.295175 ],
[0.659871 , 0.320614 ],
[0.459677 , 0.940614 ],
[0.823733 , 0.831789 ],
[0.236175 , 0.1075 ],
[0.379032 , 0.241121 ],
[0.512535 , 0.8522193]])
y = np.array([1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0])
Редактировать
Следующая строка: np.where(y==0)[0][:np.ceil(0.3*6).astype(int)]
выполните следующие действия:
np.where(y==0)[0]
— возвращает все индексы, гдеy==0
- Поскольку вы хотели получить только 30%, мы нарезаем эти индексы, чтобы получить все значения до 30% —
[:np.ceil(0.3*6).astype(int)]
Комментарии:
1. Разве нет более простого почему? я не совсем понимаю, что вы делаете
2. @rickhorn что именно ты не понимаешь?
3. какой аргумент в np.где(y==0)[0], что такое [0]? что такое нарезка: [:np.ceil(0.3 * 6).astype(int)]
4. Вы нарезаете от n-й строки до процента длины, где Y = class, верно? Я понял это, но что, если бы я хотел сделать так, чтобы захватить и сохранить в другом месте последние 7-е элементы, такие как [:-7] , точно так же, как вы это сделали
5. @rickhorn нарезка зависит от ваших потребностей, если вы хотите использовать последние 7 элементов, вы также можете это сделать
[:-7]