Maison >développement back-end >Tutoriel Python >Comment définir des fonctions par morceaux en Python

Comment définir des fonctions par morceaux en Python

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼original
2019-08-02 14:11:4116899parcourir

Comment définir des fonctions par morceaux en Python

Comment Python définit-il les fonctions par morceaux ? Ce qui suit est une fonction par morceaux :

Comment définir des fonctions par morceaux en Python

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(&#39;log0: &#39;, toc - tic)
tic = time.time()
y = log_norm1(x)
toc = time.time()
print(&#39;log1: &#39;, toc - tic)
tic = time.time()
z = log_norm2(x)
toc = time.time()
print(&#39;log2: &#39;, 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn