Tổng quan về NumPy

NumPy là gì?

NumPy là một thư viện Python hỗ trợ người dùng trong việc thực hiện các phép toán đại số. Hơi trừu tượng đúng không? Bạn còn nhớ môn đại số tuyến tính mà chúng ta đã phải được học chứ? Có phải là cái môn toàn ma trận với vector không? Đúng rồi đấy, và tin mừng là NumPy được sinh ra để giải quyết những vấn đề đó thay cho bạn.

NumPy xoay quanh một kiểu dữ liệu được gọi là NumPy array. Đại loại nó là một ma trận nhiều chiều mà mỗi phần tử là một giá trị số (ví dụ integer hoặc float). Bạn có thể thắc mắc rằng vậy tại sao không dùng kiểu list có sẵn của Python. Câu trả lời là cái gì cũng có cái giá của nó cả, việc đặt nhiều giới hạn lên các đối tượng nghiên cứu của mình cũng sẽ giúp NumPy tối ưu hoá thời gian thực hiện các phép toán. Với lợi thế về mặt thời gian này, NumPy trở thành một công cụ hữu hiệu cho việc phân tích dữ liệu, đặc biệt là những dữ liệu đa chiều.

NumPy có quan trọng không?

Okay nghe thì có vẻ hay đấy, nhưng thực sự thì NumPy được sử dụng ở đâu, những ai thì sẽ cần đến thư viện này?  Câu trả lời là, nó được sử dụng nhiều nhất trong khoa học dữ liệu (data science) và học máy (machine learning), nơi mà những phép tính đại số là cốt lõi. Và cùng với sự phát triển của những ngành kể trên, NumPy đã vươn lên trở thành một trong những thư viện quan trọng nhất của Python. Do đó, trong những phần tiếp theo, chúng ta sẽ đi tìm hiểu về cách sử dụng nó nhé.

Kiểu dữ liệu trong NumPy

Trong NumPy, chỉ có một kiểu dữ liệu duy nhất, như đã đề cập: array. array có thể là 1 chiều, 2 chiều hoặc rất nhiều chiều, nhưng tất cả vẫn đều là array. Một điều các bạn phải chú ý: tất cả các phần tử trong một array phải có cùng kiểu dữ liệu. Bạn có thể quy định về kiểu dữ liệu array ngay tại thời điểm khởi tạo như sau:
arr = np.array([1, 2, 3], dtype=np.int16)
Trong ví dụ trên, arr là một array 1 chiều gồm các phần tử thuộc kiểu int16 – các số nguyên có độ dài 16 bits (2 bytes). Bạn có thể sẽ tự hỏi np là gì? Thì np thường sẽ là tên ngắn gọn khi người dùng import numpy vào để sử dụng: import numpy as np. Bạn cũng có thể sử dụng NumPy mà không cần dùng alias, nhưng điều đó sẽ làm mất thời gian của bạn hơn.

Ngoài kiểu dữ liệu trên, NumPy còn hỗ trợ những kiểu dữ liệu sau:

  • bool
  • int
  • float
  • complex
  • int8
  • int32
  • int64
  • float16
  • float32
  • float64

Khởi tạo một Array

Trước khi có thể sử dụng các arrays thì chúng ta phải biết cách khởi tạo chúng đã đúng không? Và có thể các bạn đã nhận ra thông qua ví dụ ở phần trước, đó là gọi hàm array. Bạn chỉ cần truyền vào một list, một tuple, hoặc một kiểu dữ liệu nào đó tương tự như array, và NumPy sẽ lo phần còn lại cho bạn. Ví dụ:

import numpy as np

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

print(arr)

Và đây là output:

[1 2 3 4 5]

Bạn cũng có thể quy định số chiều của array ngay từ khi khởi tạo bằng cách thêm tham số ndmin như sau:

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

Ngược lại, để kiểm tra số chiều của array, hãy sử dụng thuộc tính ndim của array đó:

print('Số chiều của arr :', arr.ndim)

Index trong array

Vậy sau khi có các array chúng ta sẽ làm gì? Hãy bắt đầu bằng việc truy cập các giá trị trong đó nào, biết đâu NumPy lại lừa chúng ta bằng cách thay đổi các giá trị thì sao.

Cũng giống như kiểu dữ liệu mảng trong nhiều ngôn ngữ khác, array trong NumPy cũng đánh chỉ số bắt đầu từ 0. Để truy cập một phần tử ở chiều n, hãy truyền lần lượt các chỉ số ở các chiều trước cho đến n, ví dụ:

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

print('Phần tử thứ 5 của chiều thứ 2: ', arr[1, 4])

May quá, NumPy không lừa chúng ta:

Cắt array

Cắt (slice) array là hành động tạo ra một array con từ array ban đầu. Cú pháp tổng quát nhất cho thao tác này là [start:end:step]. Trong đó start và end là chỉ số bắt đầu và kết thúc của array mong muốn tạo ra từ array ban đầu, step là bước nhảy. Để dễ hình dung hơn, ta xem xét ví dụ sau:

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

print(arr[1:5:2])

Output:

Vậy nếu chúng ta không truyền một trong các tham số start, end, step thì sao? Khi đó NumPy sẽ tự đặt các tham số bị thiếu theo giá trị mặc định: start = 0, end = độ dài array trong chiều đang xét, step = 1.

Còn với array có nhiều chiều? Hãy tưởng tượng các bạn đang cắt dần từng chiều, và mọi chuyện sẽ trở nên thật dễ dàng. Ví dụ như sau:

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

print(arr[1:3, 0:2])

Output:

Kỳ diệu hơn nữa, bạn còn có thể cắt với các index âm:

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

print(arr[-5:-2])

Output:

Tìm trong array

Để tìm trong một array, hãy dùng hàm where() và truyền vào đó một điều kiện mong muốn. Hàm này sẽ trả về index của phần tử thoả mãn điều kiện đó nếu tìm thấy. Ví dụ:

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

x = np.where(arr%3 == 0)

print(x)

Output:

Kết quả trả về cho thấy phần tử index 2 và 5 là những số thoả mãn yêu cầu.

Lọc trong array

Lọc là thao tác tách một số phần tử theo điều kiện ra khỏi một array và lưu kết quả vào một array mới. Để lọc trong NumPy, chúng ta cần một python array các giá trị boolean có độ dài giống với array cần filter ban đầu. Sau đó NumPy sẽ filter array ban đầu theo index có giá trị True ở array thứ hai. Ví dụ nhé:

arr = np.array([5, 10, 15, 20, 25, 30])

filter_arr = arr >= 20

result_arr = arr[filter_arr]

print(filter_arr)
print(result_arr)

Output:

Như đã thấy trong output, dòng trên là filter array chứa các giá trị boolean, trong đó các index tương ứng giá trị 20, 25, 30 có giá trị True vì các giá trị số đã thoả mãn yêu cầu (>= 20). Sau đó np sẽ lấy các giá trị tương ứng True ở filter_arr để lọc trên arr và đưa ra kết quả cuối cùng.

 Kết luận

Trên đây là một góc nhìn tổng quan về NumPy. Tất nhiên trong khuôn khổ một bài blog, rất khó để giới thiệu hết tính năng và tác dụng của một bộ thư viện lớn như NumPy. Nhưng thật may cho chúng ta là tài liệu, hướng dẫn, sách về chủ đề này rất nhiều, đặc biệt là khi khoa học dữ liệu đang phát triển mạnh mẽ trong thời gian gần đây. Hy vọng bài viết này đã giúp ích chút ít được cho các bạn! ^^

Tài liệu tham khảo

Bài viết có tham khảo và sử dụng các ví dụ tại nguồn: https://www.w3schools.com/python/numpy_getting_started.asp

 

Add a Comment

Scroll Up