2011-02-06 8 views
8

Załóżmy, że posiada układ 2D NumPy takich jak:Pierwsze indeks wiersza w macierzy 2D NumPy gdy znane są liczne wartości kolumny

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Jak znaleźć indeks wiersza, dla którego znam wiele wartości? Na przykład, jeśli wiadomo, że kolumna 0-cia jest 2 i 1 kolumna 5, chciałbym wiedzieć, indeks wiersza gdzie ten warunek jest spełniony (wiersz 1 w tym przypadku).

moim stosowania pierwsze dwie kolumny (x, y) współrzędnych, a trzecia kolumna jest informacja o tym współrzędnych. Próbuję znaleźć określone współrzędne na liście, dzięki czemu mogę zmienić wartość w trzeciej kolumnie.

Edycja: W celu wyjaśnienia, jest tu niekwadratowych przykład:

a = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10 , 11, 12], [13, 14, 15, 16, 17, 18]]

Załóżmy, że wiem, że szukany wiersz ma 13 w kolumnie 0 i 14 w kolumnie pierwszej. Chciałbym zwrócić indeks tego wiersza. W tym przypadku chciałbym zwrócić indeks 2 (drugi wiersz).

Albo jeszcze lepiej, chciałbym, aby edytować 4th kolumny wiersza, który ma 13 kolumny 0th i 14 w 1. kolumnie. Powyżej znajduje się roztwór I stwierdzono, że w przypadku, jakie opisano (zmiana wartości 999)

A [(A [:, 0] == 13) & (A [: 1 ] == 14) 3] = 999

otrzymujemy:

a = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 999, 17, 18]]

Przepraszam, jeśli to było jasne. Czy ktoś mógłby wskazać w moim oryginalnym wpisie (nad edycją), jak można to inaczej interpretować, ponieważ mam problemy z jego wyświetleniem.

Dzięki.

EDIT 2: Poprawiono błąd w pierwszej edycji (wytłuszczone)

mogę teraz zobaczyć, jak zrobiłem to całość mylące dla każdego. Rozwiązanie mojego problemu jest dobrze opisane w stanie b) rozwiązania jedzenia. Dziękuję Ci.

+0

Jestem napompowany. Po zakończeniu edycji, jaki jest twój wynik dla: 'sum (a [0] == 13)'? Dzięki – eat

+0

Niestety spieprzyłem podczas edycji mojego postu po raz pierwszy, które teraz zmieniłem. Dziękuję za cierpliwość. – lookitsmarc

+0

Cieszę się, że udało Ci się rozwiązać swój problem. Jeśli uważasz, że moja odpowiedź była dla ciebie cenna, możesz rozważyć jej awans ;-). Dzięki – eat

Odpowiedz

4

Oto sposoby obsługi warunki dla kolumn i wierszy, zainspirowany Zen Pythona.

In []: import this 
The Zen of Python, by Tim Peters 

Beautiful is better than ugly. 
Explicit is better than implicit. 
... 

więc po drugiej wskazówki:
a) warunki na kolumnę (-y) stosuje się do rzędu (i):

In []: a= arange(12).reshape(3, 4) 
In []: a 
Out[]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In []: a[2, logical_and(1== a[0, :], 5== a[1, :])]+= 12 
In []: a 
Out[]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 21, 10, 11]]) 

b) warunki w rzędzie (ów) na kolumnę (s):

In []: a= a.T 
In []: a 
Out[]: 
array([[ 0, 4, 8], 
     [ 1, 5, 21], 
     [ 2, 6, 10], 
     [ 3, 7, 11]]) 
In []: a[logical_and(1== a[:, 0], 5== a[:, 1]), 2]+= 12 
In []: a 
Out[]: 
array([[ 0, 4, 8], 
     [ 1, 5, 33], 
     [ 2, 6, 10], 
     [ 3, 7, 11]]) 

Mam nadzieję, że to naprawdę ma sens, aby zawsze było wyraźne podczas uzyskiwania dostępu do kolumn i wierszy. Kod jest zwykle czytany przez osoby o różnym pochodzeniu.

9
In [80]: a = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) 
In [81]: a 
Out[81]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

a==2 zwraca logiczną numpy tablicy, pokazując gdzie warunek jest spełniony:

In [82]: a==2 
Out[82]: 
array([[False, True, False], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 

można znaleźć żadnych kolumn, gdzie to jest prawda za pomocą np.any(...,axis=0):

In [83]: np.any(a==2,axis=0) 
Out[83]: array([False, True, False], dtype=bool) 

In [84]: np.any(a==5,axis=0) 
Out[84]: array([False, True, False], dtype=bool) 

Można znajdź, gdzie oba warunki są jednocześnie prawdziwe, używając &:

In [85]: np.any(a==2,axis=0) & np.any(a==5,axis=0) 
Out[85]: array([False, True, False], dtype=bool) 

Wreszcie, można znaleźć indeks kolumny, gdzie warunki są jednocześnie Prawdziwa użyciu np.where:

In [86]: np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0)) 
Out[86]: (array([1]),) 
2

Doing

np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0)) 

jak unutbu sugerowaną nie będzie korzystać z informacji, że 2 jest w kolumnie 0th, a 5 w 1. Tak więc, na a = np.array([[5, 2, 3], [2, 5, 6], [7, 8, 9]]), zostanie błędnie powrócić (array([0, 1]),)

Zamiast tego można użyć

np.where((a[0]==2) & (a[1]==5)) 

aby uzyskać poprawny wynik (array([1]),).

Ponadto, jeśli chcesz edytować drugą kolumnę tego konkretnego wiersza, możesz pominąć np.where i odwołać się do niego za pomocą: a[2][(a[0]==2) & (a[1]==5)]. Będzie to również działać w przypadku zadań, na przykład a[2][(a[0]==2) & (a[1]==5)] = 11.

+0

Twój przykład przydziału nie dawał wyników, na które liczyłem. Dla a = np.array ([[5, 2, 3], [2, 5, 6], [7, 8, 9]]) używając [2] [(a [0] == 2) & (a [1] == 5)] = 11 zwraca tablicę ([[5, 2, 3], [2, 5, 6], [7, 11, 9]]), kiedy chciałem, aby zwróciła tablicę ([[ 5, 2, 3], [2, 5, 11], [7, 8, 9]]).Jednak znalazłem rozwiązanie, które daje ten wynik: a [(a [0] == 2) i (a [1] == 5), 2] = 11 – lookitsmarc

+0

@lookitsmarc: w oparciu o twój komentarz do J0ker5, Poproszę cię o sprawdzenie twojego pytania. Czy chciałbyś podać przykład nie-kwadratowego "a", który spełnia twoje wymagania? IMHO Twoje bieżące pytanie w jakiś sposób łączy ze sobą wiersze i cols. Dzięki – eat

+0

Edytowałem mój oryginalny wpis z kilkoma dodatkowymi wyjaśnieniami. Mam nadzieję, że to wystarczy. – lookitsmarc

Powiązane problemy