2013-06-05 13 views

risposta

22

Non so di un modo pulito per fare qualcosa di simile:

mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool) 
mask[indices] = False 
a[~mask] = 999 
a[mask] = 888 

Naturalmente, se si preferisce utilizzare il tipo di dati NumPy, è possibile utilizzare dtype=np.bool_ - Non ci saranno differenze nell'output. è solo una questione di preferenze davvero.

+4

perché non usare 'np.ones_like' – jamylak

+0

@jamylak - perché avevo bisogno di guardare la documentazione su 'np.ones_like', ma sapevo come' np.ones' funzionava ;-) – mgilson

+4

In una nota a margine, è possibile sostituire l'ultimo paio di righe con una singola chiamata a 'numpy.where' (questo è il caso principale in cui è davvero utile). Per esempio. 'a = np.where (maschera, 888, 999)'. –

3

Ovviamente non esiste un operatore generale not per set. Le scelte sono:

  1. sottraendo la vostra indices insieme da un insieme universale di indici (dipende dalla forma di a), ma che sarà un po 'difficile da implementare e leggere.
  2. Un tipo di iterazione (probabilmente lo for -loop è la soluzione migliore perché si desidera utilizzare il fatto che gli indici sono ordinati).
  3. Creazione di un nuovo array pieno di nuovo valore e copiatura selettiva di indici da quello vecchio.

    b = np.repeat(888, a.shape) 
    b[indices] = a[indices] 
    
4

funziona solo per gli array 1D:

a = np.arange(30) 
indices = [2, 3, 4] 

ia = np.indices(a.shape) 

not_indices = np.setxor1d(ia, indices) 
a[not_indices] = 888 
2

appena superato situazione simile, risolto in questo modo:

a = np.arange(30) 
indices=[2,3,4] 

a[indices] = 999 

not_in_indices = [x for x in range(len(a)) if x not in indices] 

a[not_in_indices] = 888 
Problemi correlati