Как работает 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__ но я ищу подробное объяснение.

550   3  

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 if x - это массив 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

    Ничего не найдено.