numpy.dtype = объект очень медленный по сравнению с numpy.dtype = int - PullRequest
0 голосов
/ 12 сентября 2018

Я ввожу высокие значения (больше 2 ^ 70) внутри массивов numpy, используя numpy.dtype = object:

numpy.array([1], dtype=numpy.object) << 70
array([1180591620717411303424], dtype=object)

Единственная причина, по которой я здесь использую dtype = numpy.object, заключается в том, что numpy.Предел int пересекается, когда вы пытаетесь ввести высокие значения внутри него.

numpy.array([1]) << 70
>>> array([64], dtype=int32) #the result should have been array([1180591620717411303424], dtype=object)

Подробности изложены в моем другом вопросе здесь. .В таких случаях использование dtype = object работает нормально.

Но я обнаружил, что использование dtype = numpy.object очень медленное.

Чтобы проверить, я сравнил время следующих операций: enter image description here

Вы можете видеть, что dtype = int намного быстрее.

Так есть ли обходной путь для ввода высоких значений внутри числовых массивов?

1 Ответ

0 голосов
/ 13 сентября 2018

На основании комментария пользователя:

Я строю немного картографический индекс человека против видео, где у меня много видео (более 1000) для ограниченного круга людей (около 100). Так каждая ячейка показывает, появляется ли этот человек в видео (1) или нет (0). Эта таблица хранится в файле. Теперь, когда я хочу знать, если два люди появляются в видео вместе или нет, тогда я читаю соответствующий ряд для этих двух людей и сделать побитовое 'И' операция, чтобы получить результат и найти индексы, где есть «1». Так что сделайте это побитовое 'И', мне нужно преобразовать двоичный список в сначала целые числа, а затем вычисляем результат.

A намного более простым решением было бы загрузить двоичный массив (здесь используются фиктивные данные, форма = люди x видео), а затем сравнить две строки, соответствующие вашим двум людям (скажем, человек 10 и человек 37). ) с помощью & и, наконец, извлекаем индексы видео, где встречаются оба:

my_map = numpy.random.randint(0,2,(100, 1000), numpy.bool)
appear_together_in_video_index = numpy.where(my_map[10] & my_map[37])

Таким образом, вы имеете дело только с булевыми (8-битными) значениями и полностью избегаете проблем с большими числами.

Чтобы ответить на оригинальный вопрос, это не совсем справедливое сравнение. Поскольку ваша цель - работать с большими числами, вы должны выполнить временные тесты между двумя решениями, которые поддерживают такие большие числа. Базовая альтернатива состоит в том, чтобы хранить вставки Python в списке Python, что не быстрее (и не проще обрабатывать), чем хранить их в виде объектов в массивах numpy.

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