je le défi suivant dans une simulation pour ma thèse de doctorat:opérations mathématiques efficaces sur les parties de tableaux de numpy « rares »
Je dois optimiser le code suivant:
repelling_forces = repelling_force_prefactor * np.exp(-(height_r_t/potential_steepness))
Dans cet extrait de code 'height_r_t' est un vrai tableau Numpy et 'potential_steepness' est un scalaire. 'repelling_force_prefactor' est également un tableau Numpy, qui est la plupart du temps ZERO, mais ONE à une position pré-calculée, qui ne change pas pendant l'exécution (c'est-à-dire un masque). De toute évidence, le code est inefficace car il serait beaucoup plus logique de ne calculer que la fonction exponentielle aux positions, où 'repelling_force_prefactor' est différent de zéro. La question est de savoir comment je fais cela de la manière la plus efficace? La seule idée que j'ai jusqu'à maintenant serait de définir la tranche à 'height_r_t' en utilisant 'repelling_force_prefactor' et d'appliquer 'np.exp' à ces tranches. Cependant, j'ai fait l'expérience que le découpage est lent (je ne sais pas si c'est généralement correct) et la solution semble maladroite. Juste comme une note de côté le ration de 1 à 0 dans 'repelling_force_prefactor' est d'environ 1/1000 et je cours cela en boucle, donc l'efficacité est très importante. (Commentaire: Je n'aurais pas de problème avec Cython, car j'aurai besoin de l'apprendre à un moment donné ... mais je suis novice, donc j'ai besoin d'un bon pointeur/explication.)
C'est une très belle, parce que la solution élégante. Une autre question - vous en avez peut-être parlé dans votre dernière phrase. Pourrais-je utiliser cette méthode pour effectuer des opérations sur différentes parties de la matrice? c'est à dire.comme ceci: height_part1 = hauteur (masque1) height_part2 = hauteur (mask2) – packoman
Et puis si je fais des opérations mathématiques sur height_part1 ou height_part2, comme height_part1 = exploitation1 (height_part1), seront-ils pris en compte dans la hauteur? – packoman
oui, le masque est un simple tableau booléen stocké dans l'attribut '.mask' du masked_array. Lorsque vous créez un tableau masqué, vous pouvez spécifier copy = False pour que vos opérations soient reflétées dans le tableau d'origine. mais la meilleure stratégie dépend des détails de votre application. –