Как получить индекс numpy.random.choice? - python

Можно ли изменить функцию numpy.random.choice, чтобы вернуть индекс выбранного элемента? В принципе, я хочу создать список и выбрать элементы случайно без замены

import numpy as np
>>> a = [1,4,1,3,3,2,1,4]
>>> np.random.choice(a)
>>> 4
>>> a
>>> [1,4,1,3,3,2,1,4]

a.remove(np.random.choice(a)) удалит первый элемент списка с таким значением, которое он встречает (a[1] в приведенном выше примере), который может не быть выбранным элементом (например, a[7]).

Ответ 1

Здесь один из способов узнать индекс случайно выбранного элемента:

import random # plain random module, not numpy's
random.choice(list(enumerate(a)))[0]
=> 4      # just an example, index is 4

Или вы можете получить элемент и индекс за один шаг:

random.choice(list(enumerate(a)))
=> (1, 4) # just an example, index is 1 and element is 4

Ответ 2

numpy.random.choice(a, size=however_many, replace=False)

Если вам нужен образец без замены, просто попросите NumPy сделать его вам. Не зацикливайте и не рисуйте предметы повторно. Это приведет к раздутому коду и ужасной производительности.

Пример:

>>> a = numpy.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.random.choice(a, size=5, replace=False)
array([7, 5, 8, 6, 2])

На достаточно недавнем NumPy (как минимум 1.17) вы должны использовать новый API случайности, который устраняет давнюю проблему производительности, когда старый путь кода API replace=False излишне генерировал полную перестановку ввода под капотом:

rng = numpy.random.default_rng()
result = rng.choice(a, size=however_many, replace=False)

Ответ 3

Что касается вашего первого вопроса, вы можете работать наоборот, произвольно выбирать из индекса массива a, а затем извлекать значение.

>>> a = [1,4,1,3,3,2,1,4]
>>> a = np.array(a)
>>> random.choice(arange(a.size))
6
>>> a[6]

Но если вам просто нужен случайный образец без замены, replace=False будет делать. Невозможно вспомнить, когда он был добавлен сначала в random.choice, может быть 1.7.0. Поэтому, если вы используете очень старый numpy, он может не работать. Помните, что значение по умолчанию replace=True

Ответ 4

Это немного в левом поле по сравнению с другими ответами, но я думал, что это может помочь, как это звучит, как будто вы пытаетесь сделать это в чуть большем смысле. Вы можете создать случайную выборку без замены, перетасовывая индексы элементов в исходном массиве:

source = np.random.randint(0, 100, size=100) # generate a set to sample from
idx = np.arange(len(source))
np.random.shuffle(idx)
subsample = source[idx[:10]]

Это создаст образец (здесь размер 10), вычерчивая элементы из исходного набора (здесь размером 100) без замены.

Вы можете взаимодействовать с не выбранными элементами, используя оставшиеся значения индекса, т.е.:

notsampled = source[idx[10:]]

Ответ 5

Вместо использования choice вы также можете просто random.shuffle ваш массив, т.е.

random.shuffle(a)  # will shuffle a in-place

Ответ 6

На основе вашего комментария:

Образец уже a. Я хочу работать непосредственно с a, чтобы я мог контролировать количество оставшихся элементов и выполнять другие операции с помощью a. - HappyPy

это звучит для меня, как будто вы заинтересованы в работе с a после n удаленных случайным образом элементов. Вместо этого, почему бы не работать с N = len(a) - n случайно выбранными элементами из a? Поскольку вы хотите, чтобы они все еще находились в исходном порядке, вы можете выбрать из индексов, например, в ответ @CTZhu, но затем сортировать их и извлекать из исходного списка:

import numpy as np
n = 3 #number to 'remove'
a = np.array([1,4,1,3,3,2,1,4])
i = np.random.choice(np.arange(a.size), a.size-n, replace=False)
i.sort()
a[i]
#array([1, 4, 1, 3, 1])

Итак, теперь вы можете сохранить это как a снова:

a = a[i]

и работать с a с удаленными элементами n.

Ответ 7

Вот простое решение, просто выберите функцию диапазона.

import numpy as np
a = [100,400,100,300,300,200,100,400]
I=np.random.choice(np.arange(len(a)))
print('index is '+str(I)+' number is '+str(a[I]))