numpy.where () подробное пошаговое объяснение / примеры [закрыто]

168

У меня проблемы с пониманием, numpy.where()несмотря на то, что я читаю документ , этот пост и этот другой пост .

Может ли кто-нибудь предоставить пошаговые закомментированные примеры с 1D и 2D массивами?

Александр Холден Дейли
источник

Ответы:

272

Поработав некоторое время, я разобрался с вещами и размещаю их здесь в надежде, что это поможет другим.

Интуитивно, np.whereэто все равно что спрашивать: « Скажите мне, где в этом массиве записи удовлетворяют заданному условию ».

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

Он также может быть использован для получения записей в массиве, которые удовлетворяют условию:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

Когда aявляется 2d массивом, np.where()возвращает массив идентификаторов строк и массив идентификаторов строк:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

Как и в случае 1d, мы можем использовать np.where()для получения записей в массиве 2d, которые удовлетворяют условию:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

Массив ([9])


Обратите внимание, что когда a1d, по- np.where()прежнему возвращает массив строк idx и массив col idx, но столбцы имеют длину 1, поэтому последний является пустым массивом.

Александр Холден Дейли
источник
10
Я изо всех сил пытался понять np.where при использовании 2d, пока не нашел ваш ответ "Когда a - это 2d массив, np.where () возвращает массив строк idx и массив col idx:". Спасибо за это.
bencampbell_14
1
Я чувствовал себя довольно глупо после прочтения документа три раза и все еще не решал загадку np.where(2d_array), спасибо за прояснение этого! Вы должны принять свой собственный ответ. е: О, это закрыто. Ну, это не должно быть
smcs
5
Обидно это было закрыто. Однако я хотел бы добавить еще одну особенность np.whereк этому в противном случае полному ответу. Функция также может выбирать элементы из массива x и y в зависимости от условия. Ограниченное пространство в этом комментарии, но смотрите: np.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]]))вернется array([[4, 8, 6], [9, 2, 1]]). Обратите внимание, какие элементы x и y выбираются в зависимости от True / False
piccolo
Объяснение, данное в этом ответе, является лишь частным случаем np.where. Согласно документации, когда conditionпредоставляется только эта функция, является сокращением для np.asarray(condition).nonzero().
Ленни
19

Здесь немного веселее. Я обнаружил, что очень часто NumPy делает именно то, что мне хотелось бы, иногда мне быстрее просто пробовать что-то, чем читать документы. На самом деле смесь обоих является лучшим.

Я думаю, что ваш ответ в порядке (и можно принять его, если хотите). Это просто «лишнее».

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

дает:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... но:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

дает:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]
UHOH
источник