Hiểu và Sử Dụng Đa Chiều Mảng trong Python với NumPy

Trong lập trình khoa học, khái niệm "tensor" thường được dùng để chỉ các mảng đa chiều — không phải là cấu trúc toán học trừu tượng mà là cách tổ chức dữ liệu có thứ nguyên rõ ràng. Một giá trị vô hướng (scalar) tương ứng với mảng 0 chiều, một danh sách một chiều là mảng 1 chiều, ma trận là mảng 2 chiều, và cứ thế tăng lên. Mỗi chiều phản ánh một trục độc lập trong không gian dữ liệu — ví dụ: một bảng theo dõi sức khỏe có thể có các trục người-dùng, thời-điểm, và chỉ-số, tạo thành mảng 3 chiều.

Khi làm việc trong Python, numpy.ndarray là nền tảng chính để biểu diễn và thao tác với các cấu trúc này. Mặc dù TensorFlow hay PyTorch cũng định nghĩa lớp Tensor, nhưng trong ngữ cảnh tính toán số học thuần túy, ndarray đủ mạnh và linh hoạt để đóng vai trò tensor thực tế.

Để xác định hình dạng của một mảng, ta đếm số phần tử ở mỗi mức lồng ghép từ ngoài vào trong:

data = [[12, 2, 2, 3],
         [4, 34, 54, 34]]

Mảng trên gồm 2 hàng, mỗi hàng chứa 4 phần tử → shape là (2, 4). Điều này nhất quán với cách duyệt vòng lặp: chỉ số đầu tiên (i) quét qua các hàng, chỉ số thứ hai (j) quét qua các cột:

for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        print(data[i, j])  # Truy cập an toàn hơn data[i][j]

1. Xử lý cực trị: np.max vs np.maximum

  • np.max(a, axis=0): trả về giá trị lớn nhất dọc theo trục 0 (tức theo từng cột); nếu không chỉ định axis, kết quả là một giá trị duy nhất.
  • np.maximum(x, y): so sánh từng cặp phần tử giữa hai mảng cùng kích thước, trả về mảng mới với các giá trị lớn hơn tại mỗi vị trí.

2. Lặp qua mảng đa chiều với bộ lặp nâng cao

Thay vì lồng vòng for, np.nditer cung cấp cơ chế kiểm soát chi tiết hơn:

import numpy as np
arr = np.array([[1, 2], [3, 4]])
it = np.nditer(arr, flags=['multi_index'], op_flags=['readwrite'])

for value in it:
    i, j = it.multi_index
    if value < 3:
        it[0] = 0  # Gán lại giá trị tại vị trí hiện tại

Cờ multi_index cho phép truy xuất tọa độ đầy đủ, còn readwrite bật khả năng sửa đổi dữ liệu gốc trong quá trình duyệt.

3. Phép tích chập cơ bản trên mảng 2D

Phép chập (convolution) không yêu cầu hai mảng phải vuông hay cùng kích thước. Với kernel k và ảnh đầu vào img, hàm scipy.signal.convolve2d hoặc numpy.einsum có thể triển khai thủ công bằng cách dịch chuyển kernel và tính tổng trọng số — đây là nền tảng cho mạng nơ-ron tích chập.

4. Mở rộng biên với numpy.pad

Hàm này hỗ trợ nhiều chiến lược điền giá trị xung quanh biên: 'constant', 'reflect', 'edge'… Ví dụ:

padded = np.pad(arr, pad_width=1, mode='constant', constant_values=0)
# Thêm một viền 0 xung quanh arr

5. Cắt lát thông minh

Cú pháp cắt lát trong NumPy cho phép chọn đồng thời nhiều trục:

volume = np.random.rand(3, 4, 5)  # shape: (người, thời_gian, chỉ_số)
subset = volume[:, 2, :]  # Chọn toàn bộ người và chỉ số, chỉ tại thời điểm thứ 3 → shape (3, 5)

6. Thuộc tính và phương thức thiết yếu của ndarray

  • Mô tả cấu trúc: .shape, .ndim, .size, .dtype
  • Chuyển đổi hình dạng: .reshape(), .transpose(), .swapaxes()
  • Thống kê: .mean(), .std(), .sum(), .argmax()

7. Toán tử số học: nên dùng NumPy thay vì math

Các hàm như np.exp(), np.log(), np.sin() được vector hóa — chúng áp dụng trên toàn bộ mảng mà không cần vòng lặp. Ngược lại, math.exp() chỉ nhận số vô hướng và sẽ gây lỗi khi truyền mảng.

Thẻ: numpy tensor multidimensional-array python-data-science

Đăng vào ngày 25 tháng 5 lúc 03:18