Comment Python définit-il les fonctions par morceaux ? Ce qui suit est une fonction par morceaux :
J'ai écrit une version simple log_norm0 au début, qui ne peut être réalisée qu'élément par élément. Inutile de dire que les vecteurs contenant un grand nombre d’éléments ralentiront définitivement.
Plus tard, j'ai pensé à utiliser une fonction d'indicateur pour distinguer les deux situations de segmentation, et j'ai obtenu log_norm1. Cependant, cette situation est assez particulière et ne peut pas être construite avec succès à chaque fois.
Recommandations associées : "Tutoriel vidéo Python"
Enfin, j'ai trouvé qu'il existe une fonction par morceaux (x, condlist, funclist, *args, **kw) dans numpy. Il est spécialement utilisé pour construire des fonctions segmentées, x est l'entrée, condlist représente les conditions de segmentation et funclist représente la fonction de traitement correspondant à la segmentation. Cela nous donne log_norm2.
# elementwise def log_norm0(x): if x >= 0: return np.log(x + 1) else: return - np.log(- x + 1) # indicator def log_norm1(x): # ind = np.where(x > 0, 1, 0) ind = (x > 0) return np.log(x * ind + 1) - np.log(- x * (1.0 - ind) + 1) # numpy.piecewise() def log_norm2(x): return np.piecewise(x, [x >= 0, x < 0], [lambda x: np.log(1 + x), lambda x: - np.log(1 - x)])
Enfin, observez le temps d'exécution de chaque fonction.
tic = time.time() for i in range(x.size): y[i] = log_norm0(x[i]) toc = time.time() print('log0: ', toc - tic) tic = time.time() y = log_norm1(x) toc = time.time() print('log1: ', toc - tic) tic = time.time() z = log_norm2(x) toc = time.time() print('log2: ', toc - tic)
Les résultats de l'observation montrent que la méthode utilisant la fonction indicateur est toujours la plus rapide, mais elle n'est pas très différente de la méthode par morceaux.
log0: 33.59282732009888 log1: 0.4863457679748535 log2: 0.5942573547363281
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!