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.
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.
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)!
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.
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]])
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