Pythonic способ заменить определенные значения другими значениями массива numpy в пределах определенных индексов - PullRequest
4 голосов
/ 20 октября 2019

Я видел ответы на каждую часть моего вопроса. Например, np.where(arr, b, c) преобразует все b в arr в c. Или arr[arr == b] = c делает то же самое. Тем не менее, у меня есть 1000 меток в массиве NumPy labels_test, включая 1 и 6. Я хочу перевернуть 30 процентов правильных меток на неправильные, чтобы получить ошибочный набор данных. Поэтому я создаю следующий список индексов, которые должны быть изменены.

l = [np.random.choice(1000) for x in range(100)] (I am not sure if each index is repeated once)

Я хочу что-то вроде

np.put(labels_test, l, if labels_test[l] ==1, then 6 and  if labels_test[l] ==6, then 1`

Мы можем сделать это для следующего примера игрушки:

np.random.seed(1)
labels_test = [np.random.choice([1,6]) for x in range(20)]
[6, 6, 1, 1, 6, 6, 6, 6, 6, 1, 1, 6, 1, 6, 6, 1, 1, 6, 1, 1]

1 Ответ

2 голосов
/ 20 октября 2019

Вот один из способов:

>>> labels_test = np.random.choice([1, 6], 20)
>>> ind = np.random.choice(labels_test.shape[0], labels_test.shape[0]//3, replace=False)
>>> labels_test
array([1, 6, 1, 1, 6, 1, 1, 1, 6, 1, 1, 1, 6, 6, 6, 6, 6, 1, 1, 1])
>>> labels_test[ind] = 7 - labels_test[ind]
>>> labels_test
array([1, 6, 1, 6, 6, 6, 1, 1, 6, 1, 6, 1, 1, 6, 1, 6, 6, 1, 1, 6])

Это переворачивает ровно 30% (с округлением до ближайшего целого числа) путем выборки без замены. В зависимости от ваших требований подходящей альтернативой может быть выбор каждого ярлыка с вероятностью 0,3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...