J'ai une matrice 3D de taille massive à traiter. Je souhaite relookez des éléments de suivant
import numpy as np given_array = np.array([1, 1, 1, 3, 3, 5, 5, 5, 8, 8, 8, 8, 8, 23, 23, 23]) required_array = np.array([0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4])
3 Réponses :
Essayez cela et voyez s'il est assez rapide. Utilisez le inverse code> retourné par
numpy.unique code> avec l'argument
retour_inverse = true code>:
Pour np.arange (300 * 300 * 300) .reshape (300 300 300) code>,
np.unique code> prend
1,74 s ± 15,3 ms par boucle (moyenne ± std. Dev. de 7 exécutions, 1 boucle chacune) code> tandis que
Relabel_Euite code> prend
979 ms ± 9,92 ms par boucle (moyenne ± STD. Dev. de 7 courses, 1 boucle chacune) < / code>. Je traite avec des réseaux
2000 x 2000x 2000 code> 3D. @ Warren weckesser
Le moyen le plus rapide devrait être d'écrire une fonction numba spécifique adaptée à ce que vous voulez.
Cet exemple rend beaucoup d'hypothèses sur l'entrée, c'est-à-dire que la matrice est triée, le premier numéro est positif, il s'agit d'une forme 1D, vous souhaitez écraser le tableau. P> p>
Le code semble fonctionner correctement lorsque le tableau est trié comme vous l'avez mentionné. Pour a = np.random.random_integers (1, 50000, 10000000000) code>,
a.sort () code> nécessite
7.06 s code> et après trier
Relabel code> prend uniquement
0,25 s code>. D'autre part,
Relabel_Suite code> prend
7.5 s code>. Avez-vous une solution à
trier () code> matrice plus rapide? @ Thane Brooker
@Zak je créerais un tableau de "compteur" 1D avec une longueur correspondant à la taille maximale entière de la matrice d'entrée. Dans votre exemple, ce serait 50000. Ensuite, je voudrais iTERE chaque entier de votre réseau et augmente la cellule du réseau de comptoirs correspondant à l'entier. Donc, si le premier élément de votre tableau était de 25 ans, alors la cellule 25 du compteur augmenterait. Etc. À la fin, je participerais au compteur de compteur et je tiens à la sortie du numéro dans un nouveau tableau. Cela ne nécessiterait qu'une itération de la matrice d'entrée et une itération du compteur.
@Zak j'ai créé ce qui précède dans une nouvelle réponse, permettez-moi de savoir comment les horaires comparent.
Si le tableau donné est non traduit, cela sera plus rapide que le trier:
array([0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4])
Ce code est 5x plus rapide code> que
Relabel_Suite code> pour
np.random.random_integers (1, 50000, 1000000000) code>. Merci pour ce @thane Brooker, j'accepte cette réponse. Pourquoi ne préférez-vous pas revenir dans la fonction numba? Est-ce que je manque quelque chose? @Thane Brooker
@ZAK La fonction écrase la matrice fournie plutôt que de créer un nouveau tableau. En ne retournant pas de tableau, cela rend ce point évident et il ne peut y avoir de confusion. Si la fonction renvoya un tableau, il serait ambigu de savoir exactement ce qui était renvoyé: - Est-ce que cela renvoie la matrice d'entrée d'origine ou a-t-elle créé un nouveau tableau? Ce n'est donc rien à voir avec Numba, mais il est plutôt plus facile de comprendre que les utilisateurs du code de comprendre ce que le code fait.
Ces éléments sont-ils toujours triés?
Non, ils ne sont pas mais
donné_array.sort () code> peut être utilisé. @ Divaker