0Pricing
Pandas & NumPy Academy · Lezione

Funzioni universali (ufunc)

Applichi agli array funzioni integrate elemento per elemento, come np.sqrt, np.abs, np.exp e np.log, senza scrivere cicli.

Funzioni universali (ufunc) è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Che cosa sono le ufunc?

Le funzioni universali (ufunc) eseguono un'operazione matematica su ogni elemento di un array simultaneamente, in C compilato e veloce, molto più rapidamente di un ciclo Python. ⚡

import numpy as np

a = np.array([1.0, 4.0, 9.0, 16.0])
print(np.sqrt(a))  # [1. 2. 3. 4.]
# Equivalent Python loop would be hundreds of times slower

Ufunc matematiche: sqrt, exp, log

Tutte le funzioni matematiche preferite sono ufunc: np.sqrt, np.exp, np.log e molte altre. Si applicano a interi array contemporaneamente e gestiscono correttamente i casi limite.

import numpy as np

a = np.array([0.0, 1.0, 2.0, 3.0])
print(np.exp(a))         # [1.    2.718 7.389 20.086]
print(np.log(np.exp(a))) # [0. 1. 2. 3.]
print(np.log2(np.array([1, 2, 4, 8])))  # [0. 1. 2. 3.]

Ufunc trigonometriche

Le ufunc trigonometriche di NumPy, come np.sin e np.cos, si aspettano angoli espressi in radianti. Usi np.deg2rad per convertire prima i gradi.

import numpy as np

angles = np.array([0, 30, 60, 90])
rad = np.deg2rad(angles)
print(np.sin(rad).round(4))  # [0.     0.5    0.866  1.   ]
print(np.cos(rad).round(4))  # [1.     0.866  0.5    0.   ]

np.abs, np.floor, np.ceil, np.round

Per gli arrotondamenti, usi np.floor (per difetto), np.ceil (per eccesso) e np.round (al più vicino). Consentono di elaborare i valori float dell'intero array in un'unica operazione.

import numpy as np

a = np.array([-2.7, 0.4, 1.5, 3.9])
print(np.abs(a))     # [2.7 0.4 1.5 3.9]
print(np.floor(a))   # [-3.  0.  1.  3.]
print(np.ceil(a))    # [-2.  1.  2.  4.]
print(np.round(a))   # [-3.  0.  2.  4.]

np.maximum e np.minimum

np.maximum(a, b) seleziona il valore maggiore in ogni posizione tra due array, diversamente da np.max, che restituisce un solo numero. np.maximum(a, 0) è ReLU!

import numpy as np

a = np.array([-3, 1, 5, -2, 4])
b = np.array([0, 0, 3, 3, 3])

print(np.maximum(a, b))  # [0 1 5 3 4]
print(np.minimum(a, b))  # [-3  0  3 -2  3]

# ReLU
print(np.maximum(a, 0))  # [0 1 5 0 4]

np.clip per limitare i valori

np.clip mantiene ogni elemento all'interno di un intervallo: ciò che è troppo basso viene portato al minimo e ciò che è troppo alto viene ridotto al massimo. È ideale per limitare i valori.

import numpy as np

a = np.array([0.1, 0.5, -0.2, 1.3, 0.9])
clipped = np.clip(a, 0.0, 1.0)
print(clipped)  # [0.1 0.5 0.  1.  0.9]

Ufunc su array multidimensionali

Le ufunc funzionano su array di qualsiasi forma. L'operazione matematica viene applicata a ogni elemento e il risultato mantiene la stessa forma, senza bisogno di reshape.

import numpy as np

m = np.array([[1.0, 4.0], [9.0, 16.0]])
print(np.sqrt(m))
# [[1. 2.]
#  [3. 4.]]

Il parametro out per l'efficienza della memoria

Ogni ufunc accetta un argomento out= per scrivere i risultati in un array già esistente. In questo modo si evita di crearne uno nuovo, cosa utile nei cicli intensivi e sensibili alla memoria.

import numpy as np

a = np.array([1.0, 4.0, 9.0])
result = np.empty(3)
np.sqrt(a, out=result)  # write directly into result
print(result)  # [1. 2. 3.]

np.add.reduce e .accumulate

Ogni ufunc ha un metodo .reduce() che combina tutti gli elementi (np.add.reduce equivale semplicemente a sum) e .accumulate() per calcolare i totali progressivi.

import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(np.add.reduce(a))       # 15
print(np.add.accumulate(a))   # [ 1  3  6 10 15]
print(np.multiply.reduce(a))  # 120

np.frompyfunc per ufunc personalizzate

np.frompyfunc trasforma qualsiasi funzione Python in una ufunc applicabile agli array. È più lenta delle funzioni integrate, quindi la riservi alla prototipazione rapida.

import numpy as np

def clamp_positive(x):
    return x if x > 0 else 0.0

vfunc = np.frompyfunc(clamp_positive, 1, 1)
a = np.array([-2, 3, -1, 5])
print(vfunc(a))  # [0.0 3 0.0 5]  (object dtype)

Confrontare le ufunc con i cicli Python

La differenza di velocità è enorme: su un milione di elementi, una ufunc può essere circa 200 volte più veloce di un ciclo Python. Nei calcoli numerici, scelga sempre prima le ufunc. 🚀

import numpy as np
import time

a = np.random.rand(1_000_000)

start = time.perf_counter()
np.sqrt(a)
print('ufunc:', round(time.perf_counter() - start, 4), 's')

start = time.perf_counter()
[x ** 0.5 for x in a]
print('loop:', round(time.perf_counter() - start, 4), 's')

Verifica rapida

Verifichi la Sua comprensione delle ufunc NumPy trattate in questa lezione.

Riepilogo della lezione

Ottimo lavoro! Le ufunc eseguono calcoli elemento per elemento in C veloce, includono sqrt, exp, log e funzioni trigonometriche, mentre l'argomento out= consente di risparmiare memoria. Prossimo argomento: le funzioni di aggregazione.

Domande Frequenti

La lezione «Funzioni universali (ufunc)» è gratuita?

Sì — il testo completo di «Funzioni universali (ufunc)» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni universali (ufunc)»?

Applichi agli array funzioni integrate elemento per elemento, come np.sqrt, np.abs, np.exp e np.log, senza scrivere cicli. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?

Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Funzioni universali (ufunc)»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?

Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni universali (ufunc)
  2. Funzioni di aggregazione
  3. Regole di broadcasting
  4. Mascheramento booleano e indicizzazione avanzata
← Torna a Pandas & NumPy Academy