Некогерентность в дополнительных индексах, извлеченных из np.array - PullRequest
0 голосов
/ 02 мая 2020

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

import numpy as np    
vec = np.arange(0,25000)
idx = np.random.choice(vec,5000)
idx_r = np.delete(vec,idx)

Однако, когда я печатаю длину ve c, idx и idx_r, они не совпадают. Сумма между idx и idx_r возвращает значения, превышающие len (ve c). Например, следующий код:

print(len(idx))
print(len(idx_r))
print(len(idx_r)+len(idx))
print(len(vec))

возвращает:

5000 20462 25462 25000

Python версия 3.8.1 и G CC 9.2. 0.

1 Ответ

0 голосов
/ 03 мая 2020

np.random.choice имеет ключевое слово аргумент replace. Его значение по умолчанию True. Если вы установите значение False, я думаю, вы получите желаемый результат.

import numpy as np

vec = np.arange(0, 25000)

idx = np.random.choice(vec, 5000, replace=False)

idx_r = np.delete(vec, idx)

print([len(item) for item in (vec, idx, idx_r)])

Out:

[25000, 5000, 20000]

Однако numpy.random.choice с replace=False чрезвычайно неэффективен из-за плохого выбора реализации, с которым они застряли для обратной совместимости - он генерирует перестановку всего ввода только для того, чтобы взять небольшую выборку. Вместо этого вы должны использовать новый Генератор API , который не имеет этой проблемы:

rng = np.random.default_rng()

idx = rng.choice(vec, 5000, replace=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...