2010-02-21 9 views
1

Actuellement, j'ai un code qui vérifie si l'élément donné dans array est égal à 0 et si c'est le cas, alors donne la valeur 'level' (temp_board est un tableau numpy array, indices_to_watch contient des coordonnées 2D à surveiller pour les zéros).Modification de tableau masqué de Numpy

indices_to_watch = [(0,1), (1,2)] 
    for index in indices_to_watch: 
     if temp_board[index] == 0: 
      temp_board[index] = level 

Je voudrais convertir en une approche plus semblable à numpy (retirer la et utiliser les fonctions que numpy) pour accélérer cela. Voici ce que j'ai essayé:

masked = np.ma.array(temp_board, mask=(a!=0), hard_mask=True) 
    masked.put(indices_to_watch, level) 

Mais malheureusement tableau masqué quand faisant, mis() veut avoir des dimensions 1D (totalement étrange!), Est-il une autre façon de mettre à jour les éléments du tableau qui sont égaux à 0 et ont du béton indices? Ou peut-être que l'utilisation de tableaux masqués n'est pas la bonne solution?

Répondre

1

Si l'on suppose qu'il est pas très inefficace pour savoir où temp_board est 0, vous pouvez faire ce que vous voulez comme ceci:

# First figure out where the array is zero 
zindex = numpy.where(temp_board == 0) 
# Make a set of tuples out of it 
zindex = set(zip(*zindex)) 
# Make a set of tuples from indices_to_watch too 
indices_to_watch = set([(0,1), (1,2)]) 
# Find the intersection. These are the indices that need to be set 
indices_to_set = indices_to_watch & zindex 
# Set the value 
temp_board[zip(*indices_to_set)] = level 

Si vous ne pouvez pas faire ce qui précède, il est ici un façon, mais je ne sais pas si c'est le plus Pythonic:

indices_to_watch = [(0,1), (1,2)] 

d'abord, convertir en tableau numpy:

indices_to_watch = numpy.array(indices_to_watch) 

Ensuite, rendre indexable:

index = zip(*indices_to_watch) 

Ensuite, testez la condition:

indices_to_set = numpy.where(temp_board[index] == 0) 

Ensuite, trouver les indices réels fixés:

final_index = zip(*indices_to_watch[indices_to_set]) 

Enfin, régler les valeurs:

temp_board[final_index] = level 
+0

Merci :) J'ai essayé numpy.where() mais je n'ai pas pensé à le combiner avec set intersection –

0

Vous devriez essayer quelque chose le long de ces lignes:

temp_board[temp_board[field_list] == 0] = level 
+0

malheureusement temp_board [field_list] == ​​0 renvoie un masque qui est plus petit que la taille de temp_board –

1

Je ne suis pas sûr que je suis tous les détails dans votre question. Si je l'ai bien compris, alors il semble que ce soit une simple indexation Numpy. Le code ci-dessous vérifie le tableau (A) pour les zéros, et où il les trouve, il les remplace par «niveau».

import numpy as NP 
A = NP.random.randint(0, 10, 20).reshape(5, 4) 
level = 999 
ndx = A==0 
A[ndx] = level 
Questions connexes