Tổng số lượt xem trang

Thứ Năm, 1 tháng 6, 2017

Numpy

Mặc dù chúng tôi rất muốn đề cập tới thuật toán Máy học ngay, tuy nhiên để mọi người hiểu được, chúng ta buộc phải có một vài những kiến thức nhất định về công cụ để cài đặt các thuật toán đó. Do vậy, trong vài bài tới, chúng tôi sẽ tiếp tục giới thiệu những kiến thức nền tảng của Python và những thư viện để người đọc nắm được. Kiên nhẫn. Bữa tiệc chính sẽ tới! :-)




      Có ứng dụng nào, từ nhỏ tới lớn, mà chúng ta không sử dụng mảng không? Hẳn nhiên mảng là một cấu trúc thường dùng nhất trong lập trình. Trong bài này, chúng tôi giới thiệu Numpy một thư viện rất rất quan trọng trong quá trình cài đặt mọi ứng dụng trong Python. 
      Numpy (viết tắt của Nummerical Python) là một thư viện không thể thiếu khi chúng ta xây dựng các ứng dụng Máy học trên Python. Numpy cung cấp các đối tượng và phương thức để làm việc với mảng nhiều chiều và các phép toán đại số tuyến tính. Trong numpy, chiều của mảng gọi là axes; trong khi số chiều gọi là rank.
      Thư viện chính trong numpy là các đối tượng mảng (array). Mảng (array) tương tự như list ở Python với điều kiện là mọi phần tử trong array phải có cùng kiểu dữ liệu. Array có thể thao tác với số lượng lớn dữ liệu số, thường là float hay int, và hiệu quả hơn trên danh sách rất nhiều.  Lớp thường dùng trong numpy là ndarray (n-dimentional array).
Khai báo khi dùng thư viện nump. Có nhiều cách để khai báo Numpy:
·         Sử dụng tất cả các đối tượng và hàm của numpy:
                   import numpy
               Chúng ta gọi trực tiếp các hàm qua cú pháp: numpy.array([1,2,3])
 
·         Có thể dùng tất cả các đối tượng trong numpy
                       from numpy import *
               Chúng ta gọi trực tiếp các hàm qua cú pháp  array([1,2,3])

·         Để ngắn gọn, nhiều người cũng dùng tên giả cho numpy. Đây là cách thường dùng:
                   import numpy as np
         Chúng ta gọi trực tiếp các hàm qua cú pháp: np.array([1,2,3])
 
Khởi tạo và xem thông tin mảng  :
import numpy as np

a = np.array([1, 2, 3])  # Tạo ra mảng một chiều từ list

print (type(a))            # "<type 'numpy.ndarray'>"print (a.shape)            # "(3,)"print (a[0], a[1], a[2])   # "1 2 3"

a[0] = 5                  
print (a)                  # "[5, 2, 3]"
 b = np.array([[1,2,3],[4,5,6]])   # Tạo ra mảng hai chiều từ listprint (b.shape)                   # "(2, 3)"
print (b.size)                     # "6": số phần từ trong mảngprint (b[0, 0], b[0, 1], b[1, 0])  # "1 2 4"
print (b)                          #  "[[1 2 3]
                                   #   [4 5 6]]"


Các cách hởi tạo mảng thông dụng:
import numpy as np
u = np.arange(3.0)        # Tạo ra mảng trong khoảng cho trước
print (u)                          # "[ 0.  1.  2.]"
v = np.arange(3,7)        
print (v)                          # "[ 3 4 5 6]"
a = np.zeros((2,2))       # Tạo ra mảng toàn số 0print (a)                 # "[[ 0.  0.]
                          #  [ 0.  0.]]"
b = np.ones((1,2))   # Tạo ra mảng toàn số 1print (b)            # "[[ 1.  1.]]"

c = np.full((2,2), 7)     # Tạo ra một mảng hằng sốprint (c)                 # "[[ 7.  7.]
                          #   [ 7.  7.]]"

d = np.eye(2)    # Tạo ma trận đơn vị 2x2
print (d)        #  "[[ 1.  0.]
                 #    [ 0.  1.]]"

e = np.random.random((2,2)) # Tạo ma trận 2x2, giá trị ngẫu nhiên trong [0,1)print (e)                     # Một khả năng: "[[ 0.91940167  0.08143941]

                            #                [ 0.68744134  0.87236687]]"

Truy cập các chỉ số (slicing):
Tương tự như list trong Python, array có thể truy cập tới các chỉ số. Tuy nhiên, do array có thể nhiều chiều, nên việc truy cập chỉ số cần chỉ rõ trên mỗi chiều tương ứng.
 
import numpy as np

# Tạo ra mảng 2 chiều có kích thước (3, 4)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
row_r1 = a[1, :]    # Truy cập vào hàng thứ 2, và tất cả các cộtrow_r2 = a[1:3, :]  # Truy cập vào từ hàng 1 tới hàng thứ 2, và tất cả các cộtprint (row_r1, row_r1.shape)       # "[5 6 7 8] (4,)"print (row_r2, row_r2.shape)       # [[5 6 7 8] 
                                   # [9 10 11 12]] (2, 4)"
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]print (col_r1, col_r1.shape) # "[ 2  6 10] (3,)"print (col_r2, col_r2.shape) # "[[ 2]
                             # [ 6]
                             # [10]] (3, 1)"



Numpy - Các phép toán trong toán học.
Numpy hỗ trợ các phép toán thực hiện các phần tử có thứ tự tương ứng  trên các mảng với nhau. Chúng ta sẽ sử dụng chúng rất nhiều trong các bài toán. Mặc dù chúng ta có thể dùng 2 phép toán dưới đây cho kết quả như nhau. Tuy nhiên, chúng ta nên dùng phép toán thứ hai: np.operator(x,y), vì nó là dạng chuẩn cho các thao tác trên kiểu numpy.ndarray.
import numpy as np

x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

# Cộng hay mảng trên sẽ cho kết quả
# [[ 6.0  8.0]
#  [10.0 12.0]]

print (np.add(x, y))

# Trừ hai mảng trên sẽ cho kết quả
# [[-4.0 -4.0]
#  [-4.0 -4.0]]print (np.subtract(x, y))

# Thực hiện phép nhân trên 2 mảng
# [[ 5.0 12.0]
#  [21.0 32.0]]

print (np.multiply(x, y))

# Thực hiện phép chia trên 2 mảng
# [[ 0.2         0.33333333]
#  [ 0.42857143  0.5       ]]

print (np.divide(x, y))

# Thực hiện phép khai căn bậc 2 trên mảng x
# [[ 1.          1.41421356]
#  [ 1.73205081  2.        ]]

print (np.sqrt(x))

Phép toán trên các hàng và cột:
import numpy as np

x = np.array([[1,2],[3,4]])print (np.sum(x))         # "10": Tổng các phần tử print (np.sum(x, axis=0)) # "[4 6]": Tổng mỗi cột print (np.sum(x, axis=1)) # "[3 7]": Tổng mỗi hàng 

Phép toán chuyển vị:
import numpy as np

x = np.array([[1,2,3], [4, 5, 6]])
print (x)        # "[[1 2 3]
                 # [4 5 6]]"print (x.T)      # "[[1 4]
                 #   [2 5]]"
                 #   [3 6]]"

# Khi mảng của chúng ta là một chiều thì phép toán không tác dụngv = np.array([1,2,3])print (v)        # "[1 2 3]"print (v.T)      # "[1 2 3]"

Phép toán nhân ma trận: tích trong (inner product)
import numpy as np

x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
v = np.array([9,10])
w = np.array([11,12])
###### Tích trong hai ma trận ######

print (np.dot(v, w))      # Tích trong, cho kết quả: 219 = 9.11+10.12
print (np.dot(x, v))      # Tích trong, cho kết quả: [29 67]
 
###### Tích của hai ma trận ######

print (np.matmul(x,y))    # Nhân hai ma trận
                          # [[19 22]
                          #  [43 50]]
print (np.matmul(x,v.T))  # Nhân hai ma trận
                          # [29 67]print (np.matmul(v,x))    # Nhân hai ma trận
                          # [39 58]

  

  
###### Tích tương ứng (elementwise) hai ma trận ######print (np.multiply(x,y))  # [[5 12]
                          #  [21 32]]
 

Phép toán thường dùng khác:
import numpy as np
 
###### Chuyển từ kiểu list sang array ######
a = [1, 2]       # a là một danh sách
print (a)        # [1, 2]print (type(a))  # <type 'list'>
a =np.asarray(a) print (a)        # [1 2]print (type(a))  # <type 'numpy.ndarray'>
 
###### Chuyển đổi kích thước của mảng và giữ nguyên dữ liệu ######
a = np.arange(6)print (a)                 # [0 1 2 3 4 5]

  
b = a.reshape((3, 2))print (b)                 # [[0 1]
                          #  [2 3]
                          #  [4 5]]
c = b.reshape((2, 3))print (c)                 # [[0 1 2]
                          #  [3 4 5]]
d = np.reshape(c, 6)print (d)                 # [0 1 2 3 4 5]

e = np.reshape(d, (3,2))  

print (e)                 # [[0 1]
                          #  [2 3]
                          #  [4 5]]
 
## chuyển mảng sang mảng một chiều
a = np.array([[1,2,3], [3,4]])print (a.flatten())       # [[1, 2, 3] [3, 4]]

###### Chèn giá trị vào trước cột/hàng được chỉ định ######
a1 = np.array([[1, 1], [2, 2], [3, 3]])print (np.insert(a1, 1, 5))        # [1 5 1 2 2 3 3]

  

  
# chèn vào cộtprint (np.insert(a1, 1, 5, axis=1))# [[1 5 1]
                                   #  [2 5 2]
                                   #  [3 5 3]]

  

  
# chèn vào hàng
print (np.insert(a1, 1, 5, axis=0))# [[1 1]
                                   #  [5 5]
                                   #  [2 2]
                                   #  [3 3]]

Tài liệu tham kháo:

0 nhận xét: