Как мне нарезать массив для любого размера

#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)] выполните следующие действия:

  1. np.where(y==0)[0] — возвращает все индексы, где y==0
  2. Поскольку вы хотели получить только 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]