2012-09-15 14 views
7

Biorąc pod uwagę tablicę 2D numpy, tj .;Zmodyfikuj numpy array w miejscu za pomocą Boole'a indeksowania

import numpy as np 

data = np.array([ 
    [11,12,13], 
    [21,22,23], 
    [31,32,33], 
    [41,42,43],   
    ]) 

Potrzebuję zmodyfikować na miejscu tablicę podrzędną na podstawie dwóch wektorów maskujących dla żądanych wierszy i kolumn;

rows = np.array([False, False, True, True], dtype=bool) 
cols = np.array([True, True, False], dtype=bool) 

Takie, że tj .;

print data 

#[[11,12,13], 
# [21,22,23], 
# [0,0,33], 
# [0,0,43]]  

Odpowiedz

5

Now, że wiesz, jak uzyskać dostęp do wierszy/cols chcesz, tylko assigne wartość chcesz swojej subarray. To odrobinę trudniejsze, choć:

mask = rows[:,None]*cols[None,:] 
data[mask] = 0 

Powodem jest to, że gdy mamy dostęp do subarray jako data[rows][:,cols] (jak pokazano w previous question bierzemy widok na widoku, a niektóre odniesienia do oryginalnych danych dostać utracone w drodze.

Zamiast tutaj budujemy 2D logiczną tablicę przez nadawanie swoich dwóch 1D tablice rows i cols jedno z drugim. Twój mask tablica ma teraz kształt (len(rows),len(cols). możemy użyć mask do bezpośredniego dostępu do oryginału pozycji data i ustawiamy je na nową wartość. gdy wykonasz data[mask], otrzymasz tablicę 1D, która nie była odpowiedzią, której oczekiwałeś w swoim previous question.

Aby skonstruować maskę, moglibyśmy stosować operator & zamiast * (bo mamy do czynienia z tablic logicznych) lub prościej np.outer funkcja:

mask = np.outer(rows,cols) 

EDIT: rekwizyty do @Marcus Jones dla rozwiązania np.outer.

+1

Czy zadanie, ale co powiesz na "maska ​​= np.outer (rows, cols)"? –

+1

Czy istnieje sposób na uzyskanie widoku z indeksowania boolowskiego? Powyższe działa tylko dlatego, że numpy traktuje przypisanie inaczej. 'data [maska]' nadal nie jest widokiem. –

Powiązane problemy