2016-12-14 2 views
0

Я хранятся 4 ndarrays в словаре dictPrices и хотел бы создать другой булево ndarray для каждого из 2-х случаях: (1) поэлементно, если число в любой из 4 ndarrays превышает х (2) поэлементно, если число во всех 4-х ndarrays превышаетбыстрый способ сравнения Numpy ndarrays

dictPrices[1] >= x работает, но когда я попытался (dictPrices[1] >= x | dictPrices[2] >= x), он терпит неудачу. (dictPrices[1] >= x or dictPrices[2] >= x) тоже не удалось.

Поскольку ndarrays может быть огромным (из monte carlo), я надеялся на векторию, а не на прохождение каждого элемента ndarray.

Спасибо!

+0

Вы уверены, что все 4 массива одинаковой формы? Каким образом пример, который вы пробовали, терпит неудачу? – wim

+0

hi wim, yup они имеют форму (7, 250000), поскольку я имитировал 4 разных ценовых набора. Ошибка выбрана: ValueError: Значение истины массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all() '. 'print ((dictPrices [1]> = x или dictPrices [2]> = x) .any())' не работает ни – AiRiFiEd

ответ

2

Я думаю, что вы хотите:

np.logical_or.reduce([prices >= x for prices in dictPrices.values()]) 

Это объясняется более подробно здесь: Numpy `logical_or` for more than two arguments

И, конечно, для второго случая вы можете использовать logical_and вместо logical_or.

+0

эй Джон, спасибо, что указал мне в правильном направлении! Код работает, и он кажется чрезвычайно эффективным ... с временем выполнения, увеличивающимся только на 0,006s, чтобы пропустить 4 набора (7, 250000). Я все еще пытаюсь выяснить из ссылки, как np.logical_or.reduce работает для многомерных массивов ... также, кажется, из вашего ответа, что на самом деле существует цикл for. но из моего ограниченного опыта, когда я пытаюсь использовать цикл normal для цикла, он обычно очень дорог - могу ли я просто спросить, почему этот метод так быстро выполняется (я понимаю это как «функциональное программирование»)? Спасибо! – AiRiFiEd

+0

@AiRiFiEd: В моем коде есть цикл «for» только над четырьмя элементами 'dictPrices'. За цикл за 4 элемента не замедляется вообще - медленнее, если вы перебираете тысячи или миллионы строк. Если вы хотите полностью исключить цикл for, вы можете переделать свою структуру данных как отдельный 2D-массив с новым измерением, равным 4. Но копирование ваших данных в это не будет стоить, если единственная причина состоит в том, чтобы избежать одного или двух петли. –

+0

Спасибо за объяснение! Когда я недавно читал книгу о python о «функциональном программировании», я попытался немного изменить ваше решение, пытаясь использовать функцию «map» - 'np.logical_and.reduce (map (lambda prices: prices> = x, dictPrices.values ​​())) '- в настоящее время он возвращает адрес памяти (' <объект карты на 0x000000000BC144E0> '), но случайно вы знаете, будет ли это работать, и ожидаете ли вы улучшения производительности? Большое спасибо за вашу помощь! – AiRiFiEd

Смежные вопросы