Hướng dẫn pillow mask python - mặt nạ gối trăn

Trong bài trước ta đã học được các thao tác tính toán trên mảng từ cơ bản đến nâng cao với NumPy. Trong việc tính toán và xử lý dữ liệu, thì lọc dữ liệu bị thiếu hoặc tính toán dựa trên một số điều kiện nhất định là rất quan trọng, và để có được điều đó thì ta thường phải làm việc với các phép toán so sánh.

Nội dung chính ShowShow

  • 1. Giới thiệu về Masks
  • Ví dụ mở đầu
  • Toán tử so sánh [Comparison Operators]
  • 2. Các thao tác với Boolean Arrays
  • Đếm số phần tử
  • Toán tử Boolean
  • 3. Module MaskedArray trong NumPy
  • Nhỏ hơn / Nhỏ hơn bằng một số
  • Lớn hơn [hoặc lớn hơn bằng] một số
  • Trong một phạm vi nhất định
  • Ngoài một phạm vi nhất định
  • 4. Tổng kết

So sánh thì đương nhiên sẽ trả về kết quả là True hoặc False [Boolean]. Trong bài này, ta sẽ học cách xử lý trên các mảng Boolean [Boolean Array] và áp dụng vào Masks, một tính năng rất hữu ích trong NumPy.

1. Giới thiệu về Masks

Ví dụ mở đầu

Toán tử so sánh [Comparison Operators]

In[1]

visitors = np.array[[5956, 1975, 4567, 7597, 2431, 2675, 3270]]

2. Các thao tác với Boolean Arrays

Đếm số phần tử

In[2]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]

Toán tử Boolean

In[3]

mask = [True, False, False, True, False, False, False]

3. Module MaskedArray trong NumPy

Nhỏ hơn / Nhỏ hơn bằng một số

Out[4]

array[[5956, 7597]]

Lớn hơn [hoặc lớn hơn bằng] một số

Trong một phạm vi nhất địnhfreetuts.net, không được copy dưới mọi hình thức.

In[5]

visitors[mask].sum[]

Ngoài một phạm vi nhất định

Toán tử so sánh [Comparison Operators]

2. Các thao tác với Boolean Arrays

In[7]:

x = np.arange[6]
print[x]
print["x < 3: ", x < 3]
print["x = 3: ", x >= 3]
print["x == 3: ", x == 3]
print["x != 3: ", x != 3]

Out[7]

[0 1 2 3 4 5]
x < 3:  [ True  True  True False False False]
x = 3:  [False False False  True  True  True]
x == 3:  [False False False  True False False]
x != 3:  [ True  True  True False  True  True]

Đếm số phần tử

In[8]

print["x * 2 = ", x * 2]
print["x ** 2 = ", x ** 2]
[x * 2] == [x ** 2]

Out[8]

x * 2 =  [ 0  2  4  6  8 10]
x ** 2 =  [ 0  1  4  9 16 25]
array[[ True, False,  True, False, False, False]]

Toán tử Boolean

3. Module MaskedArray trong NumPy Nhỏ hơn / Nhỏ hơn bằng một số
Lớn hơn [hoặc lớn hơn bằng] một sốTrong một phạm vi nhất định
Ngoài một phạm vi nhất định4. Tổng kết
So sánh thì đương nhiên sẽ trả về kết quả là True hoặc False [Boolean]. Trong bài này, ta sẽ học cách xử lý trên các mảng Boolean [Boolean Array] và áp dụng vào Masks, một tính năng rất hữu ích trong NumPy.Thay vì lý thuyết phức tạp thì ta sẽ đến một ví dụ nhỏ để hiểu về Masks. Giả sử ta có một danh sách người truy cập Freetuts trong 7 ngày gần nhất là:
Tính tổng số lượt truy cập của các ngày có số lượng truy cập > 5000.Nếu dùng Python thuần tuý, nó sẽ có dạng như sau:
Trong bài toán này, ta có thể dùng Masks để đơn giản hoá cách giải quyết. Về cơ bản, nó dùng một mảng Boolean [True/False] khi được áp lên mảng gốc sẽ trả về cho ta các giá trị cần quan tâm. Phần tử có giá trị là True sẽ thoả mãn điều kiện và ngược lại, False thì không. Trước tiên ta tạo một mảng mask:Mảng mask sẽ có cùng số phần tử với mảng visitors, và mỗi vị trí tương ứng của mảng mask sẽ cho ta biết phần tử ở mảng visitors có thoả mãn điều kiện [>5000] hay không.
Tiếp theo, ta sẽ áp mảng mask lên mảng visitors với cú pháp tương tự như đang truy cập vào phần tử của mảng:Như ta thấy, nó sẽ trả về một mảng mới thoả mãn điều kiện ban đầu, giờ ta chỉ cần áp dụng thêm phương thức sum sẵn có của NumPy:

2. Các thao tác với Boolean Arrays

Đếm số phần tử

Toán tử Boolean

3. Module MaskedArray trong NumPy

tuoi = [32, 35,  8, 25, 19, 23, 31, 31, 36, 27, 33, 18, 39,  9, 11]

Nhỏ hơn / Nhỏ hơn bằng một số

Lớn hơn [hoặc lớn hơn bằng] một số

In[9]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
0

Out[9]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
1

Trong một phạm vi nhất địnhnp.count_nonzero, và như ta đã biết ở trong hầu hết ngôn ngữ lập trình thì giá trị của False sẽ bằng 0 còn True là một, Python cũng không ngoại lệ:

Ngoài một phạm vi nhất định

In[10]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
2

4. Tổng kết

In[11]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
3

So sánh thì đương nhiên sẽ trả về kết quả là True hoặc False [Boolean]. Trong bài này, ta sẽ học cách xử lý trên các mảng Boolean [Boolean Array] và áp dụng vào Masks, một tính năng rất hữu ích trong NumPy.

In[12]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
4

Thay vì lý thuyết phức tạp thì ta sẽ đến một ví dụ nhỏ để hiểu về Masks. Giả sử ta có một danh sách người truy cập Freetuts trong 7 ngày gần nhất là:

In[13]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
5

Out[13]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
6

Tính tổng số lượt truy cập của các ngày có số lượng truy cập > 5000.np.allnp.any:

In[14]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
7

Out[14]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
8

Nếu dùng Python thuần tuý, nó sẽ có dạng như sau:

In[15]

total = 0 
for num in visitors:
    if [num > 5000]:
        total += num
print[total]
9

Out[15]

mask = [True, False, False, True, False, False, False]
0

Toán tử Boolean

3. Module MaskedArray trong NumPy

Nhỏ hơn / Nhỏ hơn bằng một sốLớn hơn [hoặc lớn hơn bằng] một số
Trong một phạm vi nhất địnhNgoài một phạm vi nhất định
4. Tổng kếtSo sánh thì đương nhiên sẽ trả về kết quả là True hoặc False [Boolean]. Trong bài này, ta sẽ học cách xử lý trên các mảng Boolean [Boolean Array] và áp dụng vào Masks, một tính năng rất hữu ích trong NumPy.
Thay vì lý thuyết phức tạp thì ta sẽ đến một ví dụ nhỏ để hiểu về Masks. Giả sử ta có một danh sách người truy cập Freetuts trong 7 ngày gần nhất là:Tính tổng số lượt truy cập của các ngày có số lượng truy cập > 5000.
Nếu dùng Python thuần tuý, nó sẽ có dạng như sau:Trong bài toán này, ta có thể dùng Masks để đơn giản hoá cách giải quyết. Về cơ bản, nó dùng một mảng Boolean [True/False] khi được áp lên mảng gốc sẽ trả về cho ta các giá trị cần quan tâm. Phần tử có giá trị là True sẽ thoả mãn điều kiện và ngược lại, False thì không. Trước tiên ta tạo một mảng mask:

3. Module MaskedArray trong NumPy

Nhỏ hơn / Nhỏ hơn bằng một số

Lớn hơn [hoặc lớn hơn bằng] một số

Module này cho phép ta tạo trực tiếp một masked array với các phần tử không hợp lệ sẽ bị gắn nhãn là không hợp lệ. Một điều lưu ý là ngược lại so với thông thường, giá trị hợp lệ sẽ là = 0 và tương đương với False, còn giá trị không hợp lệ sẽ = 1 hoặc tương đương với True.

Ta có ví dụ sau:

In[16]

mask = [True, False, False, True, False, False, False]
1

Out[16]

mask = [True, False, False, True, False, False, False]
2

Như ta thấy, mảng trả về là một mảng cùng shape với mảng ban đầu, trong đó các giá trị không phù hợp [tương ứng với mask = True] sẽ bị thay đổi giá trị thành "--". Trong ví dụ ở đầu bài, khi ta dùng cú pháp:"--". Trong ví dụ ở đầu bài, khi ta dùng cú pháp:

Thì mảng trả về sẽ không cùng kích thước với mảng ban đầu mà chỉ chứa những phần tử hợp lệ.

Nếu không quen với kiểu dùng ngược True/False này, thì ta có thể sử dụng toán tử ~ [XOR] để đảo ngược giá trị của True/False, chẳng hạn với ví dụ trên:

In[17]

mask = [True, False, False, True, False, False, False]
3

Out[17]

mask = [True, False, False, True, False, False, False]
2

Vì mảng trả về cũng là một mảng NumPy, nên ta có thể áp dụng các phương thức quen thuộc của NumPy, ví dụ như:

In[18]

mask = [True, False, False, True, False, False, False]
5

Như các bạn cũng có thể để ý, masked array trả về từ module MaskedArrays có chứa một tham số là fill_value. Đây là một điểm khá hay trong module này, đúng với cái tên của nó, nếu như bạn dùng phương thức filled lên mảng, nó sẽ điền vào các phần tử bị khuyết giá trị của fill_value, như:MaskedArrays có chứa một tham số là fill_value. Đây là một điểm khá hay trong module này, đúng với cái tên của nó, nếu như bạn dùng phương thức filled lên mảng, nó sẽ điền vào các phần tử bị khuyết giá trị của fill_value, như:

In[19]

mask = [True, False, False, True, False, False, False]
6

Out[19]

mask = [True, False, False, True, False, False, False]
7

Hoặc ta có thể điền một giá trị tuỳ ý mà ta muốn:

In[20]

mask = [True, False, False, True, False, False, False]
8

Out[20]

mask = [True, False, False, True, False, False, False]
9

Tuỳ thuộc vào điều kiện của mask, NumPy cho ta khá nhiều phương thức hỗ trợ cho từng điều kiện cụ thể:

Nhỏ hơn / Nhỏ hơn bằng một số

Ta sử dụng phương thức masked_less cho dạng điều kiện này:masked_less cho dạng điều kiện này:

In[21]

array[[5956, 7597]]
0

Out[21]

array[[5956, 7597]]
1

Tương tự với masked_less, nếu là nhỏ hơn bằng thì ta dùng masked_less_equal:masked_less, nếu là nhỏ hơn bằng thì ta dùng masked_less_equal:

In[22]

array[[5956, 7597]]
2

In[22]

array[[5956, 7597]]
3

Lớn hơn [hoặc lớn hơn bằng] một số

Ta sử dụng phương thức masked_greater cho dạng điều kiện này:masked_greater cho dạng điều kiện này:

In[23]

array[[5956, 7597]]
4

Out[23]

array[[5956, 7597]]
5

Tương tự với masked_greater_equal.masked_greater_equal.

Trong một phạm vi nhất định

Phương thức masked_inside sẽ lọc các dữ liệu trong một phạm vi nhất định:masked_inside sẽ lọc các dữ liệu trong một phạm vi nhất định:

In[24]

array[[5956, 7597]]
6

Out[24]

array[[5956, 7597]]
7

Ngoài một phạm vi nhất định

Tương tự trên nhưng ngược lại, ta có phương thức masked_outside:masked_outside:

In[25]

array[[5956, 7597]]
8

Out[25]

array[[5956, 7597]]
9

Trên là 4 phương thức phổ biến cho các điều kiện nhất định của masks, nếu bạn muốn tìm hiểu một số phương thức khác ít sử dụng hơn thì có thể tham khảo tại đây: The numpy.ma module — NumPy v1.19 Manual

4. Tổng kết

Qua bài trên bạn đã được tìm hiểu các thao tác với mảng Boolean, cũng như cách áp dụng nó với Masks. Masks là một tính năng cực kỳ hữu ích trong NumPy, giúp ta giảm thiểu code đi khá nhiều và tính toán trở nên thuận lợi hơn. Trong bài sau, ta sẽ tìm hiểu về Fancy Indexing trong NumPy - một tính năng sẽ sử dụng Masks khá nhiều. Hẹn gặp bạn ở bài tiếp.

Bài Viết Liên Quan

Chủ Đề