Element-wise Operations

Operations applied to each element:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# Arithmetic
print(arr + 10)      # [11, 12, 13, 14, 15]
print(arr * 2)       # [2, 4, 6, 8, 10]
print(arr ** 2)      # [1, 4, 9, 16, 25]

# Between arrays
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2)   # [5, 7, 9]
print(arr1 * arr2)   # [4, 10, 18]

Mathematical Functions

NumPy provides many math functions:

arr = np.array([1, 4, 9, 16, 25])

# Basic statistics
print(np.sum(arr))        # 55
print(np.mean(arr))       # 11.0
print(np.std(arr))        # Standard deviation
print(np.var(arr))        # Variance

# Min/Max
print(np.min(arr))        # 1
print(np.max(arr))        # 25
print(np.argmin(arr))     # Index of min: 0
print(np.argmax(arr))     # Index of max: 4

Universal Functions (ufunc)

Fast element-wise functions:

arr = np.array([1, 4, 9, 16, 25])

# Trigonometric
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles))
print(np.cos(angles))

# Exponential and logarithmic
print(np.exp(arr))        # e^x
print(np.log(arr))        # Natural log
print(np.log10(arr))      # Base 10 log
print(np.sqrt(arr))       # Square root

Array Broadcasting

Operations between arrays of different shapes:

# 1D array
arr = np.array([1, 2, 3])

# Broadcasting with scalar
print(arr + 5)            # [6, 7, 8]

# Broadcasting with 2D
matrix = np.array([[1], [2], [3]])
print(arr + matrix)       # [[2, 3, 4], [3, 4, 5], [4, 5, 6]]

Matrix Operations

Linear algebra operations:

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# Matrix multiplication
print(np.dot(a, b))        # [[19, 22], [43, 50]]
print(a @ b)              # Same (Python 3.5+)

# Transpose
print(a.T)                # [[1, 3], [2, 4]]

# Determinant
print(np.linalg.det(a))    # -2.0

# Inverse
print(np.linalg.inv(a))   # Inverse matrix

Statistical Operations

Statistical functions:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# Percentiles
print(np.percentile(arr, 50))   # Median: 5.5
print(np.percentile(arr, [25, 75]))  # Quartiles

# Median
print(np.median(arr))     # 5.5

# Correlation
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([2, 4, 6, 8, 10])
print(np.corrcoef(arr1, arr2))  # Correlation matrix

Best Practices

  • Use vectorized operations: Much faster than loops
  • Avoid Python loops: NumPy operations are optimized
  • Use broadcasting: Efficient operations on different shapes
  • Choose appropriate dtypes: int32 vs int64 based on needs

Next Steps

Learn about creating arrays or indexing and slicing.