2 votes

Remplacer les éléments dans un tableau Numpy par une valeur et un emplacement

Je travaille sur un programme qui va créer des données de contour à partir d'arrays numpy, et j'essaie d'éviter les appels à matplotlib.

J'ai un array de longueur L qui contient des arrays NxN de booléens. Je veux convertir ceci en un array LxNxN où, par exemple, les "True" dans le premier array interne sont remplacés par "rouge", dans le deuxième, par "bleu" et ainsi de suite.

Le code suivant fonctionne comme prévu:

import numpy as np
import pdb

def new_layer(N,p):
    return np.random.choice(a=[False,True],size=(N,N),p=[p,1-p])

a = np.array([new_layer(3,0.5),new_layer(3,0.5),new_layer(3,0.5)]).astype('object')

colors = np.array(["red","green","blue"])

for i in range(np.shape(a)[0]):
    b = a[i]
    b[np.where(b==True)] = colors[i]
    a[i] = b
print(a)

Mais je me demande s'il y a un moyen d'accomplir la même chose en utilisant les outils intégrés de Numpy, par exemple, l'indexation. Je suis nouveau sur Numpy et je soupçonne qu'il y a une meilleure façon de le faire mais je ne vois pas ce que ce serait. Merci.

2voto

Paul Panzer Points 30707

Vous pourriez utiliser np.copyto :

np.copyto(a, colors[:, None, None], where=a.astype(bool))

0voto

Divakar Points 20144

Voici une façon -

a_bool = a.astype(bool)
a[a_bool] = np.repeat(colors,a_bool.sum((1,2)))

Une autre façon en étendant colors à 3D -

a_bool = a.astype(bool)
colors3D = np.broadcast_to(colors[:,None,None],a.shape)
a[a_bool] = colors3D[a_bool]

0voto

fvizeus Points 88

Vous pouvez utiliser une combinaison d'index booléens et np.indices. Vous pouvez également utiliser a comme index pour lui-même. Ensuite, vous pourriez faire ce que vous avez fait dans la boucle for avec cette ligne (bien que je ne pense pas que ce soit nécessairement une bonne idée):

a[a.astype(bool)] = colors[np.indices(a.shape)[0][a.astype(bool)]]

De plus, pour la fonction new_layer, vous pourriez simplement utiliser np.random.rand(N,N) > p (je ne suis pas sûr si la distribution réelle sera exactement la même que ce que vous aviez).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X