Comment définir des fonctions par morceaux en Python

爱喝马黛茶的安东尼
Libérer: 2019-08-02 14:11:41
original
16696 Les gens l'ont consulté

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)])
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!