Как работает 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, если x
является массивом numpy. Это массив значений True / False, а не одно значение.
кроме того, массивы 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
is 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]])