0
votes

Array 2D en tant qu'index d'un tableau 3D

J'ai eu un tableau 2D (C) avec des éléments 8000x64, un (s) tableau (s) 1D avec des éléments 8000x1 et une autre matrice 1D (D) avec des éléments 1x64. Chaque rangée d'index i, où s [i] est vrai, sera ajouté par vecteur d. Cela fonctionne assez bien:

for i in range(I):
        C_this = C[:,:,i]
        s_this = s[:,i]
        d_this = d[:,i]

        C_this[s_this == True] += d_this
        C[:,:,i] = C_this


5 commentaires

Est s déjà booléen? Si oui, utilisez-le comme index direct. == true n'est pas nécessaire.


Oui, s est booléen. Merci.


Êtes-vous libre de changer les dimensions autour?


Sûr, je peux tout changer autour


Donnez-nous un petit exemple de travail.


3 Réponses :


2
votes

Il est plus facile avec la dimension supplémentaire au début: xxx

votre chemin: xxx


3 commentaires

Vous pouvez éviter la boucle si vous utilisez répéter . Je ne sais pas que c'est une amélioration (à peu près sûr que ce n'est pas), mais bon, entièrement vectorisé.


+1 de moi. Je pense que vous avez lancé @Madphysicist avec la section "VOTRE WAIL", la première section fonctionne de sa part. Je me suis fait quelques peaux moi-même et avons couru un profileur dessus. Je vais créer une réponse séparée avec mon code, mais je dirais que celui-ci devrait être marqué comme "correct".


Tu as raison que je n'ai pas lu attentivement. Ceci est infiniment plus élégant que la merde que j'ai écrite. @ burks832. Merci d'avoir ramené cela à mon attention et de me faire lire.



1
votes

en raison de la fonctionnement de l'indexation numpy, s code> sélectionne les lignes correspondantes de C code> dans le premier exemple. Pour faire la même chose dans le cas 3D, vous devriez remodeler C code> dans quelque chose qui est (8000 * 3, 64) code> et s code> dans (8000 * 3, 1) code>. Le seul problème est maintenant d'obtenir d code> pour tenir compte du nombre de lignes de chaque troisième dimension, ce qui peut être effectué avec np.repeat code>.

La première partie est P>

repeats = np.count_nonzero(s, axis=0)
C.reshape(-1, 64)[s.ravel()] += np.repeat(d, repeats, axis=0)


0 commentaires

0
votes

Voici ma mise en œuvre de la méthode @HPaulj proposée. Notez que je ne veux pas prendre le crédit de lui, alors marquez sa réponse, pas la mienne, aussi correcte. Je voulais juste partager ce que j'ai fait. XXX

J'ai ensuite profilé au programme que j'ai fabriqué, et il court sur ma machine en moins de 450 millisecondes (les deux dernières lignes prennent moins de 300 ms). Notez que les appels vers "Randint" étaient juste pour configurer les valeurs de la matrice, de sorte que ces lignes ne s'appliqueraient pas à votre cas d'utilisation.


0 commentaires