2009-11-06 13 views

Odpowiedz

7

Wygląda na to, że po prostu nie można wykonać zadania za pomocą takiego podwójnego plasterka.

Działa to jednak:

a[numpy.where(a==1)[0][1:]] = 3 
4

Ponieważ w [a == 1] część nie jest rzeczywiście kawałek. Tworzy nową tablicę. Ma to sens, gdy się nad tym zastanowisz - bierzesz tylko te elementy, które spełniają warunek boolowski (jak operacja filtra).

+0

Dodałem drugi przykład, który działa tak, jak oczekuję. Naprawdę nie widzę różnicy. Czy zadanie nie powinno być "przepuszczone"? –

+2

Nie sądzę, że to jest w porządku. Jeśli zrobisz 'a [== 1] = 3', to faktycznie zmieni zawartość a. –

+1

@Dave - Myślę, że to perimosocodiae jest poprawne, a twój kontrprzykład jest spowodowany czymś bardziej podobnym do hackowania w numpy internals, aby stworzyć wygląd operacji w miejscu. – tom10

0

to robi to, co chcesz

a[2:][a[2:]==1]=3 
+1

Ale to wymaga wiedzy z góry, że pierwsze wystąpienie 1 jest na pozycji 1. –

10

To związane, jak fantazyjne dzieła indeksowania. Istnieje dokładne wyjaśnienie: here. Dokonuje się tego w ten sposób, aby umożliwić modyfikację lokalną za pomocą fantazyjnego indeksowania (tj. a[x>3] *= 2). Konsekwencją tego jest to, że nie można przypisać do podwójnego indeksu, jak znalazłeś. Fancy indeksowanie zawsze zwraca kopię, a nie widok.

+0

W rzeczywistości twoje rozwiązanie modyfikuje pierwsze wystąpienie 1, co nie jest tym, czego chce. –

+0

Dobrze - zdjąłem to przed twoim komentarzem. Ps hi Philip, to Robin! – robince

+0

Hej Robin - jaka jest szansa, że ​​się tu spotkamy ... Pozdrawiam z Monachium! –

Powiązane problemy