12  Funkcje uniwersalne (ufunc) i inne matematyczne

Funkcje uniwersalne (tzw. ufunc) to jedne z najważniejszych narzędzi w NumPy. Są to funkcje działające element-po-elemencie na tablicach, często implementowane w C, co zapewnia wysoką wydajność obliczeń. Dzięki ufuncs można w prosty i czytelny sposób wykonywać operacje arytmetyczne, trygonometryczne, statystyczne czy logiczne na całych tablicach bez konieczności pisania pętli w Pythonie.

12.1 Podstawowe operacje arytmetyczne

NumPy automatycznie przekształca operatory matematyczne w odpowiednie ufunc.
Na przykład:

  • + odpowiada np.add
  • - odpowiada np.subtract
  • * odpowiada np.multiply
  • / odpowiada np.divide
  • ** odpowiada np.power

Przykład:

import numpy as np

A = np.array([1, 2, 3, 4])
B = np.array([10, 20, 30, 40])

# Operacje element-po-elemencie
sum_tab = np.add(A, B)       # to samo co A + B
diff_tab = np.subtract(B, A) # to samo co B - A
mul_tab = np.multiply(A, 2)  # to samo co A * 2
pow_tab = np.power(A, 3)     # to samo co A ** 3

print("Suma:", sum_tab)
print("Różnica:", diff_tab)
print("Mnożenie przez 2:", mul_tab)
print("Potęgowanie:", pow_tab)
Suma: [11 22 33 44]
Różnica: [ 9 18 27 36]
Mnożenie przez 2: [2 4 6 8]
Potęgowanie: [ 1  8 27 64]

12.2 Funkcje trygonometryczne i pochodne

NumPy oferuje bogaty zestaw funkcji trygonometrycznych:

  • np.sin, np.cos, np.tan – funkcje podstawowe,
  • np.arcsin, np.arccos, np.arctan – odwrotne funkcje trygonometryczne,
  • np.sinh, np.cosh, np.tanh – funkcje hiperboliczne.

Przykład:

import numpy as np

x = np.linspace(0, np.pi, 5) # tablica [0, π/4, π/2, 3π/4, π]
sin_values = np.sin(x)
cos_values = np.cos(x)

print("Wartości sin(x):", sin_values)
print("Wartości cos(x):", cos_values)
Wartości sin(x): [0.00000000e+00 7.07106781e-01 1.00000000e+00 7.07106781e-01
 1.22464680e-16]
Wartości cos(x): [ 1.00000000e+00  7.07106781e-01  6.12323400e-17 -7.07106781e-01
 -1.00000000e+00]

12.3 Funkcje wykładnicze i logarytmiczne

  • np.exp – eksponenta,
  • np.log – logarytm naturalny,
  • np.log10 – logarytm dziesiętny.

Przykład:

import numpy as np

A = np.array([1, np.e, np.e**2])
print("A:", A)
print("log(A):", np.log(A))
print("exp(A):", np.exp([0, 1, 2]))  # exp(0)=1, exp(1)=e, exp(2)=e^2
A: [1.         2.71828183 7.3890561 ]
log(A): [0. 1. 2.]
exp(A): [1.         2.71828183 7.3890561 ]

12.4 Funkcje zaokrąglające i wartości bezwzględne

  • np.round – zaokrągla do najbliższej liczby,
  • np.floor – podłoga,
  • np.ceil – sufit,
  • np.trunc – obcięcie do części całkowitej,
  • np.abs – wartość bezwzględna.

Przykład:

import numpy as np

B = np.array([1.7, -2.5, 3.5, 4.52, -4.1])
print("B:", B)
print("floor(B):", np.floor(B))
print("ceil(B):", np.ceil(B))
print("abs(B):", np.abs(B))
print("round(B):", np.round(B))
print("rint(B):", np.rint(B))
print("round(B,1):", np.round(B,1))
B: [ 1.7  -2.5   3.5   4.52 -4.1 ]
floor(B): [ 1. -3.  3.  4. -5.]
ceil(B): [ 2. -2.  4.  5. -4.]
abs(B): [1.7  2.5  3.5  4.52 4.1 ]
round(B): [ 2. -2.  4.  5. -4.]
rint(B): [ 2. -2.  4.  5. -4.]
round(B,1): [ 1.7 -2.5  3.5  4.5 -4.1]

12.5 Funkcje statystyczne i agregujące

Choć wiele funkcji statystycznych dostępnych jest jako metody tablic (np. A.mean(), A.std()), istnieją też ufuncs działające element-po-elemencie lub akceptujące parametry osi:

  • np.minimum, np.maximum – zwracają minimum/maksimum element-po-elemencie z dwóch tablic,
  • np.fmin, np.fmax – podobne do wyżej wymienionych, ale ignorują wartości NaN,
  • np.sqrt – pierwiastek kwadratowy,
  • np.square – podniesienie do kwadratu.

Przykład:

import numpy as np

C1 = np.array([1, 4, 9, 16])
C2 = np.array([2, 2, 5, 20])

print("minimum elementów C1 i C2:", np.minimum(C1, C2))
print("maximum elementów C1 i C2:", np.maximum(C1, C2))
print("sqrt(C1):", np.sqrt(C1))
print("square(C2):", np.square(C2))
minimum elementów C1 i C2: [ 1  2  5 16]
maximum elementów C1 i C2: [ 2  4  9 20]
sqrt(C1): [1. 2. 3. 4.]
square(C2): [  4   4  25 400]