Как работает python numpy.где () работать?
я играю с numpy и копаться в документации и наткнулась на магию. А именно я говорю о numpy.where():
>>> x = np.arange(9.).reshape(3, 3)
>>> np.where( x > 5 )
(array([2, 2, 2]), array([0, 1, 2]))
как они достигают внутренне, что вы можете передать что-то вроде x > 5 В метод? Я думаю, это как-то связано с __gt__ но я ищу подробное объяснение.
3 ответов:
как они достигают внутренне, что вы можете передать что-то вроде x > 5 в метод?
короткий ответ заключается в том, что они не делают.
любая логическая операция над массивом numpy возвращает логический массив. (т. е.
__gt__,__lt__и т. д. Все возвращают логические массивы, где данное условие истинно).например.
x = np.arange(9).reshape(3,3) print x > 5выходы:
array([[False, False, False], [False, False, False], [ True, True, True]], dtype=bool)это та же причина, почему что-то вроде
if x > 5:вызывает ValueError ifx- это массив numpy. Это массив истинных / ложных значений, а не одно значение.кроме того, массивы numpy могут индексироваться логическими массивами. Е. Г.
x[x>5]доходность[6 7 8]в этом случае.честно говоря, это довольно редко, что вам на самом деле нужно
numpy.whereно он просто возвращает индексы, где логический массивTrue. Обычно вы можете делать то, что вам нужно, с помощью простого логического индексирования.
Ответ это сбивает с толку. Это дает вам места (все из них), где ваше утверждение истинно.
так:
>>> a = np.arange(100) >>> np.where(a > 30) (array([31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]),) >>> np.where(a == 90) (array([90]),) a = a*40 >>> np.where(a > 1000) (array([26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]),) >>> a[25] 1000 >>> a[26] 1040Я использую его в качестве альтернативы список.index (), но он также имеет много других применений. Я никогда не использовал его с 2D массивов.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
Ответ Кажется, что человек что-то спрашивал более фундаментальный.
вопрос был в том, как вы могли бы реализовать что-то, что позволяет функции (например, где) знать, что было запрошено.
во-первых, обратите внимание, что вызов любого из операторов сравнения сделал интересную вещь.
a > 1000 array([False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True`, True, True, True, True, True, True, True, True, True], dtype=bool)`Это делается путем перегрузки метода " _ _ gt__". Например:
>>> class demo(object): def __gt__(self, item): print item >>> a = demo() >>> a > 4 4как вы можете видеть," a > 4 " был действительным кодом.
вы можете получить полный список и документацию всех перегруженных функций здесь: http://docs.python.org/reference/datamodel.html
что-то невероятное, как просто это сделать. Все операции в python выполняются таким образом. Высказывание a > b эквивалентно a. gt(b)!
np.whereвозвращает кортеж длиной, равной размеру numpy ndarray, на котором он вызывается (другими словамиndim) и каждый элемент кортежа является numpy ndarray индексов всех тех значений в начальном ndarray, для которых условие истинно. (Пожалуйста, не путайте размер с формой)например:
x=np.arange(9).reshape(3,3) print(x) array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) y = np.where(x>4) print(y) array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))
y-кортеж длины 2, потому чтоx.ndimв 2. 1-й элемент в кортеже содержит номера строк всех элементов больше 4 и 2-й элемент содержит номера столбцов всех элементов больше 4. Как вы можете видеть, [1,2,2,2] соответствует номерам строк 5,6,7,8 и [2,0,1,2] соответствует номерам столбцов 5,6,7,8 Обратите внимание, что ndarray проходит по первому измерению(по строкам).аналогично,
x=np.arange(27).reshape(3,3,3) np.where(x>4)
вернет кортеж длиной 3, потому что x имеет 3 измерения.но подождите, есть еще np.куда?
когда два дополнительных аргументы добавляются в
np.where; он будет выполнять операцию замены для всех тех парных комбинаций строк и столбцов, которые получены вышеуказанным кортежем.x=np.arange(9).reshape(3,3) y = np.where(x>4, 1, 0) print(y) array([[0, 0, 0], [0, 0, 1], [1, 1, 1]])
Comments