Skip to Content
Python📦 Thư viện NumpyGiới thiệu về NumPy

NumPy là gì?

NumPy là gói thư viện cơ bản cho tính toán khoa học trong Python. Đây là một thư viện Python cung cấp đối tượng mảng đa chiều, các đối tượng dẫn xuất khác nhau (như mảng mặt nạ và ma trận), và một tập hợp các quy trình cho các thao tác nhanh trên mảng, bao gồm toán học, logic, thao tác hình dạng, sắp xếp, lựa chọn, I/O, biến đổi Fourier rời rạc, đại số tuyến tính cơ bản, các thao tác thống kê cơ bản, mô phỏng ngẫu nhiên và nhiều hơn nữa.

Cốt lõi của gói NumPy là đối tượng ndarray. Đối tượng này đóng gói các mảng n chiều của các kiểu dữ liệu đồng nhất, với nhiều thao tác được thực hiện trong mã biên dịch để đạt hiệu suất cao. Có một số khác biệt quan trọng giữa mảng NumPy và các chuỗi Python tiêu chuẩn:

  • Kích thước cố định: Mảng NumPy có kích thước cố định khi tạo, không giống như danh sách Python (có thể phát triển động). Việc thay đổi kích thước của một ndarray sẽ tạo ra một mảng mới và xóa mảng cũ.
  • Dữ liệu đồng nhất: Các phần tử trong mảng NumPy đều phải thuộc cùng một kiểu dữ liệu, và do đó sẽ có cùng kích thước trong bộ nhớ. Ngoại lệ: người ta có thể có các mảng gồm các đối tượng (Python, bao gồm cả NumPy), từ đó cho phép tạo các mảng có các phần tử kích thước khác nhau.
  • Hiệu suất: Mảng NumPy tạo điều kiện cho các thao tác toán học nâng cao và các loại thao tác khác trên lượng lớn dữ liệu. Thông thường, các thao tác như vậy được thực hiện hiệu quả hơn và với ít mã hơn so với việc sử dụng các chuỗi tích hợp sẵn của Python.
  • Hệ sinh thái: Ngày càng có nhiều gói phần mềm dựa trên Python trong lĩnh vực khoa học và toán học sử dụng mảng NumPy; mặc dù các gói này thường hỗ trợ đầu vào là chuỗi Python, chúng sẽ chuyển đổi đầu vào đó thành mảng NumPy trước khi xử lý và chúng thường xuất ra mảng NumPy. Nói cách khác, để sử dụng hiệu quả phần lớn phần mềm Python khoa học/toán học hiện nay, chỉ biết cách sử dụng các kiểu chuỗi tích hợp của Python là không đủ - người ta cũng cần biết cách sử dụng mảng NumPy.

Các điểm về kích thước chuỗi và tốc độ đặc biệt quan trọng trong tính toán khoa học. Một ví dụ đơn giản, hãy xem xét trường hợp nhân từng phần tử trong một chuỗi 1-D với phần tử tương ứng trong một chuỗi khác có cùng độ dài. Nếu dữ liệu được lưu trữ trong hai danh sách Python, ab, chúng ta có thể lặp qua từng phần tử:

c = [] for i in range(len(a)): c.append(a[i]*b[i])

Cách này tạo ra kết quả chính xác, nhưng nếu ab mỗi danh sách chứa hàng triệu số, chúng ta sẽ phải trả giá cho sự không hiệu quả khi lặp trong Python. Chúng ta có thể hoàn thành nhiệm vụ tương tự nhanh hơn nhiều trong C bằng cách viết (để làm rõ, chúng ta bỏ qua các khai báo và khởi tạo biến, cấp phát bộ nhớ, v.v.):

for (i = 0; i < rows; i++) { c[i] = a[i]*b[i]; }

Tại sao NumPy lại nhanh?

Vector hóa (Vectorization) mô tả sự vắng mặt của bất kỳ vòng lặp, lập chỉ mục rõ ràng nào, v.v., trong mã - những điều này đang diễn ra, tất nhiên, chỉ là “sau hậu trường” trong mã C đã được tối ưu hóa và biên dịch trước. Mã vector hóa có nhiều ưu điểm, trong đó có:

  • Mã vector hóa ngắn gọn hơn và dễ đọc hơn
  • Ít dòng mã hơn thường có nghĩa là ít lỗi hơn
  • Mã giống với ký hiệu toán học tiêu chuẩn hơn (giúp việc lập trình các cấu trúc toán học trở nên dễ dàng hơn, thông thường là chính xác hơn)
  • Vector hóa dẫn đến mã mang tính “Pythonic” hơn. Nếu không có vector hóa, mã của chúng ta sẽ tràn ngập các vòng lặp for không hiệu quả và khó đọc.

Broadcasting (Cơ chế lan truyền) là thuật ngữ được sử dụng để mô tả hành vi ngầm định trên từng phần tử của các thao tác; nói chung, trong NumPy tất cả các thao tác, không chỉ các thao tác số học, mà cả logic, bit-wise, hàm, v.v., đều hoạt động theo kiểu ngầm định trên từng phần tử này, tức là chúng lan truyền (broadcast). Hơn nữa, trong ví dụ trên, ab có thể là các mảng đa chiều có cùng hình dạng, hoặc một vô hương và một mảng, hoặc thậm chí là hai mảng có hình dạng khác nhau, miễn là mảng nhỏ hơn có thể “mở rộng” theo hình dạng của mảng lớn hơn theo cách mà sự lan truyền kết quả là rõ ràng.

Ai khác sử dụng NumPy?

NumPy hỗ trợ đầy đủ cách tiếp cận hướng đối tượng, bắt đầu một lần nữa với ndarray. Ví dụ, ndarray là một lớp, sở hữu vô số phương thức và thuộc tính. Nhiều phương thức của nó được phản chiếu bởi các hàm trong không gian tên NumPy ngoài cùng, cho phép lập trình viên lập trình theo bất kỳ mô hình nào họ thích. Sự linh hoạt này đã cho phép phương ngữ mảng NumPy và lớp NumPy ndarray trở thành ngôn ngữ thực tế của trao đổi dữ liệu đa chiều được sử dụng trong Python.

Last updated on