2015-05-20 4 views
3

В моем наборе данных я около 200 строк, но для минимального рабочего, например, давайте предположим, что следующий массив:Удаление строк в отдельных индексов из Numpy массива

arr = np.array([[1,2,3,4], [5,6,7,8], 
       [9,10,11,12], [13,14,15,16], 
       [17,18,19,20], [21,22,23,24]]) 

я могу взять случайную выборку из 3 строк следующим образом:

indexes = np.random.choice(np.arange(arr.shape[0]), int(arr.shape[0]/2), replace=False) 

Используя эти индексы, я могу выбрать мои тестовые случаи следующим образом:

testing = arr[indexes] 

Я хочу для удаления строк в этих индексах, и я могу использовать оставшиеся элементы для моего набора тренировок.

От должности here, кажется, что training = np.delete(arr, indexes) должен это сделать. Но вместо этого я получаю 1d-массив.

Я также пробовал предложение here с использованием training = arr[indexes.astype(np.bool)], но это не дало четкого разделения. Я получаю элемент [5,6,7,8] в наборах для обучения и тестирования.

training = arr[indexes.astype(np.bool)] 

testing 
Out[101]: 
array([[13, 14, 15, 16], 
     [ 5, 6, 7, 8], 
     [17, 18, 19, 20]]) 

training 
Out[102]: 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12]]) 

Любая идея, что я делаю неправильно? Благодарю.

+0

Не подделывать t [прочитать документы] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html); в документации есть ответ на ваш вопрос. – user2357112

ответ

5

К удалять индексированные строки из массива numpy:

arr = np.delete(arr, indexes, axis=0) 
2

Один подход должен был бы получить оставшиеся индексы строк с np.setdiff1d, а затем использовать эти индексы строк, чтобы получить желаемый результат -

out = arr[np.setdiff1d(np.arange(arr.shape[0]), indexes)] 

Или использовать np.in1d использовать boolean indexing -

out = arr[~np.in1d(np.arange(arr.shape[0]), indexes)] 
+0

Я понятия не имею, но это сработало для меня над np.delete(). У меня была матрица (1000,17) и я хотел работать со всеми, кроме одной строки, на каждой итерации по строкам. Команда delete иногда давала мне 998 и 999 в качестве моей выходной длины, а не 999 каждый раз. Я думал, что это ошибка округления, и что сравнение не происходит достаточно хорошо, но это не так. Я не знаю достаточно о python, чтобы знать, почему удаление не работает, к сожалению. – ashley