Почему random.sample не может обрабатывать пустые массивы, а random.choices может? - PullRequest
0 голосов
/ 06 января 2019

Модуль Python random имеет random.choices для отбора проб с заменой и random.sample для отбора проб без замены. * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Хотя 1001 * принимает список случайно выбранных элементов относительно первого измерения.

TypeError: Население должно быть последовательностью или набором. Для диктов используйте список (d).

С другой стороны, random.choices не будет принимать наборы, поднимая

TypeError: объект 'set' не поддерживает индексирование.

Что меня интересует, так это то, что это недосмотр или есть существенная причина для ограничения random.sample последовательностями и наборами, тогда как random.choices ограничивается объектами, поддерживающими индексацию, несмотря на то, что функции имеют очень похожие цели.

P.S. если кто-то задается вопросом о том, как сэмплировать ndarray, numpy.random.choice сэмплирует 1-мерные массивы как с заменой, так и без нее, а массивы более высокой размерности могут быть эффективно выбраны для любого измерения с расширенным индексированием, где индексы для этого измерения генерируются с помощью * 1024. *

1 Ответ

0 голосов
/ 06 января 2019

random.sample пытается проверить , является ли его аргумент экземпляром collections.abc.Sequence или collections.abc.Set. Это гораздо менее надежная проверка, чем считают многие, поскольку она обнаруживает только типы, которые конкретно наследуются от этих ABC или которые явно зарегистрированы. numpy.ndarray не наследует от этих классов и не зарегистрирован.

Без чека или если вы явно делаете collections.abc.Sequence.register(numpy.ndarray), random.sample, обрабатывает numpy.ndarray штраф.

Кстати, numpy.random.choice с replace=False абсурдно неэффективен, генерируя полную перестановку входных данных только для того, чтобы взять небольшую выборку. Это давняя проблема , которая не была исправлена ​​из-за того, что естественное исправление изменило бы результаты для людей, использующих seed. В зависимости от параметров, часто быстрее использовать random.sample или вычислять образец вручную.

...