l'affectation de valeurs dans un tableau numpy
J'ai un tableau numpy de zéros. Pour le concret, supposons qu'il 2x3x4:
x = np.zeros((2,3,4))
et supposons que j'ai un 2x3 tableau d'entiers aléatoires de 0 à 3 (l'indice de la 3ème dimension de x).
>>> y = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
>>> y
[[2 1 0]
[3 2 0]]
Comment dois-je faire les affectations suivantes efficacement (edit: quelque chose qui n'est pas utiliser pour des boucles et des œuvres de x avec un nombre quelconque de dimensions et de n'importe quel nombre d'éléments dans chaque dimension)?
>>> x[0,0,y[0,0]]=1
>>> x[0,1,y[0,1]]=1
>>> x[0,2,y[0,2]]=1
>>> x[1,0,y[1,0]]=1
>>> x[1,1,y[1,1]]=1
>>> x[1,2,y[1,2]]=1
>>> x
array([[[ 0., 0., 1., 0.],
[ 0., 1., 0., 0.],
[ 1., 0., 0., 0.]],
[[ 0., 0., 0., 1.],
[ 0., 0., 1., 0.],
[ 1., 0., 0., 0.]]])
Grâce,
James
OriginalL'auteur user1857751 | 2012-11-27
Vous devez vous connecter pour publier un commentaire.
Pour le moment, je ne peux que penser de la “simple” version, ce qui implique l'aplatissement long de la première de deux dimensions. Ce code devrait fonctionner:
Ce rendements (avec mon généré de façon aléatoire
y
):La clé est, si vous faites une indexation à l'aide de plusieurs tableaux numpy (des fonctions avancées d'indexation), numpy utilisera paires d'indices de l'indice dans le tableau.
Bien sûr, assurez-vous que
x
ety
sont à la fois C ou F-ordonnance — sinon, les appels àreshape
etflatten
pourrait donner des ordres différents.OriginalL'auteur illya
Utilisation numpy.meshgrid() pour faire des tableaux d'index que vous pouvez utiliser à l'index dans le tableau d'origine et le tableau de valeurs pour la troisième dimension.
J'ai renommé votre tableau de x à a, et le tableau des indices de y à z, pour plus de clarté.
EDIT: 4D exemple:
oui, bien sûr, elle généralise d'une manière simple. meshgrid pour créer des vecteurs d'indices dans toutes les dimensions que vous ne pas rechercher, puis d'utiliser celles à l'index du tableau d'origine et les index que vous souhaitez regarder.
OriginalL'auteur Alex I
va produire le résultat désiré, IIRC. Si les dimensions du tableau ne change jamais, envisager de remplacer les deux boucles for et de leur fardeau par
J'ai besoin de code qui permettra de gérer toutes les dimensions de x, c'est à dire un nombre quelconque de dimensions ou de n'importe quel nombre d'éléments dans chaque dimension.
Je ne suis pas très familier avec numpy donc je ne sais pas si c'est pertinent builtin fonction pour faire le travail. Bien sûr, il ya liées routines argwhere, différent de zéro, où, et l'extrait que peut faire le contraire, par exemple connaître l'emplacement de non-zéros dans un tableau
OriginalL'auteur James Waldby - jwpat7