Jak python numpy.gdzie () pracować?

Bawię się numpy i przekopuję się przez dokumentację i natknąłem się na magię. Mianowicie mówię o numpy.where():

>>> x = np.arange(9.).reshape(3, 3)
>>> np.where( x > 5 )
(array([2, 2, 2]), array([0, 1, 2]))

Jak osiągnąć wewnętrznie, że jesteś w stanie przekazać coś takiego x > 5 do metody? Myślę, że ma to coś wspólnego z __gt__, ale szukam szczegółowego wyjaśnienia.

Author: JasonMArcher, 2011-04-13

3 answers

Jak osiągnąć wewnętrznie, że jesteś w stanie przekazać coś takiego jak x > 5 do metody?

Krótka odpowiedź jest taka, że nie.

Każdy rodzaj operacji logicznych na tablicy numpy zwraca tablicę logiczną. (tj. __gt__, __lt__, itd Wszystkie zwracają tablice boolowskie, gdzie podany warunek jest true).

Np.

x = np.arange(9).reshape(3,3)
print x > 5

array([[False, False, False],
       [False, False, False],
       [ True,  True,  True]], dtype=bool)

Jest to ten sam powód, dla którego coś w rodzaju if x > 5: podnosi ValueError, Jeśli x jest numpy / align = "left" / Jest to tablica wartości True / False, a nie pojedyncza wartość.

Ponadto tablice numpy mogą być indeksowane za pomocą tablic logicznych. Np. x[x>5] daje [6 7 8], w tym przypadku.

Szczerze mówiąc, to dość rzadkie, że rzeczywiście potrzebujesz numpy.where, ale zwraca tylko wskazania, gdzie tablica boolean jest True. Zazwyczaj możesz zrobić to, czego potrzebujesz dzięki prostemu indeksowaniu logicznemu.

 72
Author: Joe Kington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 22:48:27

Stara Odpowiedź to trochę mylące. Daje Ci lokalizacje (wszystkie z nich), gdzie twoje stanowisko jest prawdziwe.

Więc:

>>> 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

Używam go jako alternatywy dla listy.index (), ale ma również wiele innych zastosowań. Nigdy nie używałem go z tablicami 2D.

Http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

Nowa Odpowiedź Wydaje się, że osoba pytała o coś bardziej fundamentalnego.

Pytanie brzmiało jak czy można zaimplementować coś, co pozwala funkcji (np. gdzie) wiedzieć, co było wymagane.

Najpierw zauważ, że wywołanie któregoś z operatorów porównania robi interesującą rzecz.

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)`

Odbywa się to przez przeciążenie metody "__gt__". Na przykład:

>>> class demo(object):
    def __gt__(self, item):
        print item


>>> a = demo()
>>> a > 4
4

Jak widzisz, "a > 4" był poprawnym kodem.

Możesz uzyskać pełną listę i dokumentację wszystkich przeciążonych funkcji tutaj: http://docs.python.org/reference/datamodel.html

Coś to niesamowite, jak proste jest to zrobić. Wszystkie operacje w Pythonie są wykonywane w taki sposób. Powiedzenie a > b jest równoważne a. gt(b)!

 21
Author: Garrett Berg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 23:13:03

np.where zwraca krotkę o długości równej wymiarowi numpy ndarray, na którym jest wywoływana (innymi słowy ndim), a każdy element krotki jest numpy ndarray indeksów wszystkich tych wartości w początkowym ndarray, dla których warunek jest prawdziwy. (Proszę nie mylić wymiaru z kształtem)

Na przykład:

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 jest krotką długości 2, Ponieważ x.ndim jest 2. Pierwszy element w krotce zawiera liczbę wierszy wszystkich elementów większych niż 4, a drugi element zawiera numery kolumn wszystkich pozycji większe niż 4. Jak widać, [1,2,2,2] odpowiada numerom wierszy 5,6,7,8, a [2,0,1,2] odpowiada numerom kolumn 5,6,7,8 Zauważ, że ndarray jest przesuwany wzdłuż pierwszego wymiaru(w zależności od rzędu).

Podobnie,

x=np.arange(27).reshape(3,3,3)
np.where(x>4)


zwróci krotkę o długości 3, ponieważ x ma 3 Wymiary.

[[7]} ale czekaj, jest coś więcej do np.gdzie!

Po dodaniu dwóch dodatkowych argumentów do np.where; wykona operację replace dla wszystkie te pary kombinacji wierszy i kolumn, które uzyskuje się przez powyższą krotkę.

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]])
 0
Author: Piyush Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 21:44:45