Hi mọi người , như các bạn đã biết thì ma trận hay mảng là một phần nào đó không thể thiếu trong các bài toán lập trình . Nó được áp dụng rộng rãi trong các thuật toán về xử lý ảnh , lọc nhiễu … Nhưng để làm việc với nó cũng không kém phần phức tạp . Trong python rất đặc biệt ở chỗ ngoài cách tạo mảng hay ma trận bình thường , chúng ta còn có thể tạo qua thư viện numpy. Hôm nay mình sẽ hướng dẫn một vài mẹo nhỏ khi sử dụng mảng numpy nhé !

I . Sự Khác Nhau Giữa Numpy Arrays và Lists Trong Python .

  • Để tạo ra 1 Lists trong python :
lists = [1,2,3,4,5]
  • Hoặc để tạo ra 1 Numpy Arrays :
import numpy as np
np_array = np.array([1,2,3,4])
  • Để so sánh sự khác nhau chúng ta sẽ thực hiện vài phép tính cơ bản mới mảng . Đầu tiên là ví dụ về phép cộng :
import numpy as np
np_array = np.array([1,2,3,4])
lists = [1,2,3,4,5]
print(np_array + np_array)
print(lists + lists)
Kết quả của phép cộng

Lưu ý rằng phép cộng trên mảng NumPy thực hiện phép cộng theo phần tử, trong khi phép cộng trên List Python dẫn đến nối danh sách. Hãy cẩn thận trong khi code . Chỗ này rất dễ sai lầm nếu không hiểu rõ về numpy .

  • Ví dụ về phép nhân với một số của Mảng NumpyList Python:
import numpy as np
np_array = np.array([1,2,3,4])
lists = [1,2,3,4,5]
print(np_array * 3)
print(lists * 3)
Kết quả cuuar phép nhân mảng numpy

Cũng giống như phép cộng thì phép nhân với một số đối với mảng Numpy là nhân từng phần tử với số đó . Còn đối với List của python là tăng danh sách lên gấp n lần với n là số nhân .

II . Ma Trận Hoặc Là Mảng Chứa Mảng

  • Trong đại số tuyến tính, ma trận là một cấu trúc gồm n hàng nhân m cột. Điều đó có nghĩa là mỗi hàng phải có cùng số cột. Với NumPy, chúng ta có hai cách để tạo ma trận:
    • Dùng np.array([aray1,array2 ,…]) . Phương thức này là phương thức được khuyên dùng
    • Dùng  np.matrix() // Hết ai sài cái này rồi
  • Ví dụ về khởi tạo ma trận 3×4( 3 dòng và 4 cột) :
import numpy as np
np_array = np.array([1,2,3,4])
np_ma_tran1 = np.array([np_array,np_array,np_array])
np_ma_tran2 = np.array([np_array,[1,1,1,1],np_array])
print(np_ma_tran1)
print("lưu ý các mảng con của ma trận phải cùng số phần tử")
print(np_ma_tran2)
print(np_ma_tran2.shape) #kiem tra kích thướt ma trận
Kết quả tạo ma trận
  • Nếu bạn tạo ra 1 ma trận với kích thướt các mảng con không giống nhau thì bạn thực hiện phép tính sẽ không chính xác . Cùng xét 2 ví dụ sau:
  • Ví dụ 1 : Tạo Ma trận có kích thướt các mảng con bằng nhau :
import numpy as np

np_ma_tran1 = np.array([ [1,2] , [3,4] ])
print(np_ma_tran1)
print("Phep nhan :" , np_ma_tran1 * 2)
Kết quả của phép nhân ma trận numpy đúng

Như vậy phép nhân một ma trận nếu bạn khởi tạo đúng sẽ cho ra kết quả giống với mảng numpy.

  • Tiếp đến ví dụ 2 , Nếu bạn khởi tạo các phần tử của ma trận có kích thướt khác nhau :
import numpy as np
np_ma_tran1 = np.array([ [1,2] , [3,4,5],[1,2,3,4] ])
print(np_ma_tran1)
print("Phep nhan :" , np_ma_tran1 * 2)
Phép nhân khi khởi tạo ma trận sai

Như vậy nếu bạn khởi tạo ma trận sai thì kết quả phép nhân sẽ ra tương tự khi bạn nhân List trong python với một số đó là cộng các phần tử lên N lần .

III. Tính Norm của Mảng Numpy hay Ma Trận ( Độ dài vetor trong không gian)

  • Công Thức tính norm:
import numpy as np

np_ma_tran1 = np.array([ [1,2] , [3,4] ])
np_ma_tran2 = np.array([1,2,3,4])
norm1 = np.linalg.norm(np_ma_tran1)
norm2 = np.linalg.norm(np_ma_tran2)
print(norm1)
print(norm2)
  • Nếu bạn không thêm bất kỳ tham số nào cho hàm np.linalg.norm() thì hàm này sẽ chỉ coi cái ma trận là 1 mảng số mà thôi . Nhưng nếu bạn thêm có nó tham số sau :
    • axis = 0 là lấy cột của trận để tính .
    • axis = 1 là lấy hàng của ma trận để tính .
  • Xét ví dụ sau :
import numpy as np
np_ma_tran1 = np.array([[1, 1], [2, 2], [3, 3]]) #tạo ma trận 3 x 2
norm_cot = np.linalg.norm(np_ma_tran1 , axis=0) # trả về 2 giá trị
norm_hang = np.linalg.norm(np_ma_tran1 , axis=1) #trả về 3 giá trị
print(norm_cot)
print(norm_hang)
lấy norm của hàng và cột

IV. Tất Cả Các Cách Tính Tích Vô Hướng Của Hai Mảng Numpy Cùng Kích Thước.

  • Công thức tính tích vô hướng :
  • Tích vô hướng của 2 vector sẽ nhận giá trị của 2 vector và trả về giá trị là 1 số . Ta xét các cách tính tích vô hướng qua ví dụ sau :
import numpy as np
nparray1 = np.array([0, 1, 2, 3]) 
nparray2 = np.array([4, 5, 6, 7]) 
#cach 1 : cách hay sử dụng nhất
kq1 = np.dot(nparray1,nparray2)
#cách 2 : Cách cũng hơi gà tí nhưng ok 
kq2 = np.sum(nparray1*nparray2)
#cách 3 : Cách Này không đến mức là tệ nhưng ít sài
kq3 = nparray1 @ nparray2
#cách 4 : Cách này gọi là noob , mà cũng chẳng ai sài đâu
kq4 = 0
for a, b in zip(nparray1, nparray2):
    kq4 += a * b
print(kq1)
print(kq2)
print(kq3)
print(kq4)
Kết quả của các ví dụ về tích vô hướng

V . Tính Giá Trị Trung Bình Và Tổng Của Mỗi Hàng Hoặc Cột Của Một Mảng Numpy

  • Giống như tính Norm để lấy hàng hoặc cột của ma trận ta thêm tham số axis :
    • axis = 0 để lấy cột
    • asis = 1 để lấy hàng
  • Xét ví dụ để tìm tổng mỗi hàng hoặc cột của ma trận:
import numpy as np
np_ma_tran1 = np.array([[1, -1], [2, -2], [3, -3]]) #tạo ma trận 3 x 2
sum_cot = np.sum(np_ma_tran1,axis=0)
sum_hang = np.sum(np_ma_tran1,axis=1)
print(sum_cot)
print(sum_hang)
Tính tổng mỗi hàng hoặc mỗi cột của ma trận

Như vậy ta đã tính tổng được 2 cột của ma trận, mỗi cột có tổng = 6 và 3 hàng mỗi hàng có tổng bằng 0.

  • Tiếp tục xét 1 ví dụ về tính giá trị trung bình của mỗi hàng hoặc mỗi cột :
import numpy as np
np_ma_tran1 = np.array([[1, -1], [2, -2], [3, -3]]) #tạo ma trận 3 x 2
mean = np.mean(np_ma_tran1) #giá trị trung bình của ma trận
mean_cot = np.mean(np_ma_tran1, axis = 0)
mean_hang = np.mean(np_ma_tran1, axis = 1)
print("trung binh cua ma tran : ",mean)
print("trung binh moi cot cua ma tran : ",mean_cot)
print("trung binh moi hang cua ma tran : ",mean_hang)
Gía trị trung bình của ma trận và mỗi hàng , mỗi cột

VI. Một Số Lệnh Hay Dùng Khi Sử Dụng Mảng Numpy.

  1. numpy.squeeze : Xóa các mục nhập một chiều khỏi hình dạng của một mảng.
  2. numpy.expand_dims(a,axis) : Thêm chiều cho mảng
  3. numpy.broadcast_arrays(*args, subok=False) :
  4. numpy.reshape(a, newshape, order=’C) : Chỉnh sửa chiều của mảng nhưng không thay đổi dữ liệu của nó.
  5. numpy.ravel(a, order=’C’) : Trả về 1 mảng phẳng liền kề
  6. ndarray.flatten(order=’C’) : Trả về 1 bản copy của mảng với số chiều là 1.
  7. numpy.unique(a, return_counts=True) : Đếm số lần xuất hiện của giá trị a trong mảng .

VII .Tổng Kết

  • Phía trên là một vài mẹo về cách sử dụng mảng numpy , Nó rất hữu ích cho bạn nào định nghiên cứu về machine learning hoặc data science.
  • Tài liệu mình lượm nhặc được từ rất nhiều nguồn trên Internet . Mình muốn chia sẻ tới các bạn mục đích cùng học tập là chính nên mình cũng không biết liệt kê sao . Mong mọi người thông cảm!
  • Để biết thêm về project hay ho có thể tham gia group của mình :https://www.facebook.com/groups/164371998723215
  • Có câu hỏi hay có đề tài hay muốn mình làm liên hệ qua fanpage hoặc facebook cá nhân : https://www.facebook.com/sonnguyen16032000/
  • Hoặc tham khảo các bài viết khác tại Hóng Tin
  • Cảm ơn các bạn đã quan tâm theo dõi , hẹn các bạn ở bài lần tới vào ngày tiếp theo ! See You Again!