Numpy เบื้องต้น - 2 D#

20 minutes

วัตถุประสงค์

หลังจากทำทำแล็บ นศ.จะสามารถ

  • สร้างและดำเนินการทางคณิตศาสตร์กับข้อมูลชนิด numpy อาร์เรย์ 2 มิติได้

Ref:


ความสำคัญของข้อมูลอาร์เรย์ สถิติ หลายมิติ RBG …

การสร้างอาร์เรย์ 2 มิติ (2D Numpy Array)#

# Import the libraries

import numpy as np 
import matplotlib.pyplot as plt

สร้างลิสต์ (List) a ขึ้นมา ซึ่งเป็น nested list 3 ลิสต์ที่มีขนาดเท่ากัน

# Create a list

#a = [[11, 12, 13], [21, 22, 23], [31, 32, 33]]
a = [[11, 12, 13], 
     [21, 22, 23], 
     [31, 32, 33]]
a
[[11, 12, 13], [21, 22, 23], [31, 32, 33]]

เราสามารถสร้าง Numpy Array จากลิสต์ได้ ดังต่อไปนี้

# Convert list to Numpy Array
# Every element is the same type

A = np.array(a)
A
array([[11, 12, 13],
       [21, 22, 23],
       [31, 32, 33]])

เราสามารถเรียกแอตทริบิวต์ (attribute) ndim (number of dimensions) เพื่อดูจำนวนแกน (axes) หรือ จำนวนมิติ (dimensions) ของอาเรย์ได้

# Show the numpy array dimensions

A.ndim
2

แอตทริบิวต์ shape ส่งค่ากลับเป็นข้อมูลชนิด tuple ที่สอดคล้องกับขนาด (size) หรือจำนวนสมาชิกในแต่ละมิติ (รูปร่างของอาเรย์)

# Show the numpy array shape

A.shape
(3, 3)

จำนวนสมาชิกทั้งหมดที่มีอยู่ในอาร์เรย์สามารถดูได้จากแอตทริบิวต์ size.

# Show the numpy array size

A.size
9

การเข้าถึงสมาชิกในอาร์เรย์#

เช่นเดียวกันกับอาร์เรย์ 1 มิติ เราสามารถเข้าถึงข้อมูลแต่ละตัวภายในอาร์เรย์ได้โดยใช้เครื่องหมายวงเล็บเหลี่ยม (ก้ามปู) [ ] (square brackets)

ความสัมพันธ์ระหว่างเลขดัชนีในวงเล็บเหลี่ยมกับสมาชิกแต่ละตัวแสดงได้ในรูปต่อไปนี้ (อาร์เรย์ 3x3)

อาร์เรย์ 2 มิติ คือ Array of Array

เราสามารถเข้าถึงสมาชิกที่อยู่ในแถวที่ 2 (2nd-row) และคอลัมน์ที่ 3 (3rd column) ดังแสดงในรูป

โดยใช้เครื่องหมายวงเล็บเหลี่ยม [ ] และดัชนีที่สอดคล้องกับตำแน่งที่เราต้องการ

# Access the element on the second row and third column

A[1, 2]
23

หรือจะเขียนรูปแบบแบบนี้ก็ได้ ให้ผลลัพธ์เหมือนกัน (มีสองรูปแบบ!)

# Access the element on the second row and third column

A[1][2]
23

ลองเข้าถึงสมาชิกที่กำหนดในรูปภาพต่อไปนี้

แถวที่ 0 คอลัมน์ที่ 0 ดังนั้น

# Access the element on the first row and first column

A[0][0]
11

เราสามารถตัดเฉพาะส่วน (slicing) ได้เช่นเดียวกัยอาร์เรย์ 1 มิติ

รูปด้านล่าง: เราจะตัดเอาเฉพาะสองคอลัมน์แรกที่อยู่ในแถวแรกเท่านั้น

ตัดได้โดยใช้คำสั่งต่อไปนี้

# Access the element on the first row and first and second columns

A[0][0:2]
array([11, 12])

เช่นเดียวกัน เราสามารถตัดเอาเฉพาะสองแถวแรกที่อยู่ในคอลัมน์ที่ 3 เท่านั้น

# Access the element on the first and second rows and third column

A[0:2, 2]
array([13, 23])

ดังแสดงในรูป

สมาชิกที่อยู่ในแถวที่ 0, แถวที่ 1, แถวที่ 2 ตามลำดับ

A[0]
array([11, 12, 13])
A[1]
array([21, 22, 23])
A[2]
array([31, 32, 33])

หรือแบบนี้ก็ได้

A[2, :]
array([31, 32, 33])

สมาชิกที่อยู่ในคอลัมน์ที่ 0, คอลัมน์ที่ 1, คอลัมน์ที่ 2 ตามลำดับ

A[:][0]
array([11, 12, 13])
A[:][1]
array([21, 22, 23])
A[:][2]
array([31, 32, 33])
Note: ใน Numpy axis 0 คือแกนของแถว (row) ส่วน axis 1 คือแกนของคอลัมน์ (column)

การดำเนินการสำหรับ Numpy Array 2 มิติขั้นพื้นฐาน#

เรายังสามารถบวกอาร์เรย์ได้อีกด้วย การบวกนี้เหมือนกับการบวกเมทริกซ์ กล่าวคือเป็นการนำสมาชิกแต่ละตัวมาบวกกันเป็นคู่ๆ

รูปต่อไปนี้แสดงการบวกเมทริกซ์ X และ Y

สร้างอาร์เรย์ X และ Y ขึ้นมา

# Create a numpy array X

X = np.array([[1, 0], [0, 1]]) 
X
array([[1, 0],
       [0, 1]])
# Create a numpy array Y

Y = np.array([[2, 1], [1, 2]]) 
Y
array([[2, 1],
       [1, 2]])

ทำการบวกอาร์เรย์ X และ Y ด้วยคำสั่งต่อไปนี้

# Add X and Y

Z = X + Y
Z
array([[3, 1],
       [1, 3]])

ทำการลบอาร์เรย์ X และ Y ด้วยคำสั่งต่อไปนี้

# X - Y

Z = X - Y
Z
array([[-1, -1],
       [-1, -1]])

อาร์เรย์จะบวกลบกันได้ ก็ต่อเมื่อมีรูปร่าง (shape) เหมือนกัน!

X = np.array([[1, 0, 1], [0, 1, 1]]) 
Y = np.array([[2, 1], [1, 2], [1, 1]]) 
print(X)
print(Y)
[[1 0 1]
 [0 1 1]]
[[2 1]
 [1 2]
 [1 1]]
# ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 
#Z = X+Y
#print(Z)

การคูณ Numpy array ด้วยสเกลาร์นั้นเหมือนกับการคูณเมทริกซ์ด้วยสเกลาร์ ถ้าเราคูณเมทริกซ์ Y ด้วยสเกล 2 เราก็คูณทุกองค์ประกอบในเมทริกซ์ด้วย 2 ดังที่แสดงในรูป

คูณอาร์เรย์ Y ด้วย 2

# Create a numpy array Y

Y = np.array([[2, 1], [1, 2]]) 
Y
array([[2, 1],
       [1, 2]])
# Multiply Y with 2

Z = 2 * Y
Z
array([[4, 2],
       [2, 4]])

การคูณอาร์เรย์สองอาร์เรย์เป็น การคูณฮาดามาร์ด (Hadamard product/Element-wise multiplication) *

การคูณ Hadamard เป็นการคูณแต่ละสมาชิกที่อยู่ในตำแหน่งเดียวกันเป็นคู่ๆ ผลลัพธ์ของการคูณจะมีขนาดเดียวกับ X หรือ Y ดังแสดงในรูปต่อไปนี้

* ผลคูณฮาดามาร์ดใช้ในการวิเคราะห์เชิงสถิติ โดยเฉพาะอย่างยิ่งใช้ในแบบจำลองเชิงเส้นทั่วไป (general linear models) และแบบจำลองการวิเคราะห์ตัวประกอบในรูปทั่วไป (generalized factor analysis model)

เราสามารถคูณแต่ละสมาชิกของอาร์เรย์ X และ Y ได้โดยการเขียนโค้ดต่อไปนี้

# Create a numpy array X

X = np.array([[1, 0], [0, 1]]) 
X
array([[1, 0],
       [0, 1]])
# Create a numpy array 

Y = np.array([[2, 1], [1, 2]]) 
Y
array([[2, 1],
       [1, 2]])
# Multiply X with Y

Z = X * Y
Z
array([[2, 0],
       [0, 2]])

นอกจากการคูณแล้ว การหาร การยกกำลัง และหารเอาเศษ ก็เป็นการคำนวณเป็นคู่ๆ ทีละตัว ดังตัวอย่างต่อไปนี้

print(X/Y, '\n')
print(X**Y, '\n')
print(X%Y, '\n')
[[0.5 0. ]
 [0.  0.5]] 

[[1 0]
 [0 1]] 

[[1 0]
 [0 1]] 

คูณแบบเมทริกซ์

นอกจากนี้ เรายังสามารถคูณ Numpy arrays A และ B แบบเมทริกซ์ ได้อีกด้วย

ก่อนอื่น กำหนดเมทริกซ์ A (2x3) และ B (3x2)

# Create a matrix A

A = np.array([[0, 1, 1], [1, 0, 1]])
A
array([[0, 1, 1],
       [1, 0, 1]])
# Create a matrix B

B = np.array([[1, 1], [1, 1], [-1, 1]])
B
array([[ 1,  1],
       [ 1,  1],
       [-1,  1]])

ใช้ฟังก์ชั่น dot คูณอาร์เรย์ทั้งสอง

# Calculate the dot product

Z = np.dot(A,B)
Z
array([[0, 2],
       [0, 2]])
# Calculate the sine of Z

np.sin(Z)
array([[0.        , 0.90929743],
       [0.        , 0.90929743]])


เราสามารถเรียกแอตทริบิวต์ T (Transpose) เพื่อคำนวณเมทริกซ์สลับเปลี่ยน (Transpose) สลับแถวและคอลัมน์

Note: เมทริกซ์สลับเปลี่ยน (transpose of a matrix) คือเมทริกซ์ที่ได้จากการสลับสมาชิกจากแถวเป็นคอลัมน์ และจากคอลัมน์เป็นแถวของเมทริกซ์ต้นแบบ เมตริกซ์ทรานสโพสของ A เขียนแทนด้วย AT

# Create a matrix C

C = np.array([[1,1],[2,2],[3,3]])
C
array([[1, 1],
       [2, 2],
       [3, 3]])
# Get the transposed of C

C.T
array([[1, 2, 3],
       [1, 2, 3]])
C.T.T
array([[1, 1],
       [2, 2],
       [3, 3]])

[Exercise]#

1 จงเขียนโค้ดเปลี่ยนลิสต์ a ต่อไปนี้ให้เป็น Numpy Array

# Write your code below and press Shift+Enter to execute

a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
Click here for the solution
A = np.array(a)
A

2 จงคำนวณหาจำนวนสมาชิกหรือขนาด (size) ของอาร์เรย์

# Write your code below and press Shift+Enter to execute
Click here for the solution
A.size

3 จงเข้าถึงสมาชิกที่อยู่ในแถวแรกคอลัมน์แรก และ แถวแรกคอลัมน์ที่สอง

# Write your code below and press Shift+Enter to execute
Click here for the solution
A[0][0:2]

4 จงหาผลคูณแบบเมทริกซ์ของ numpy arrays A และ B

# Write your code below and press Shift+Enter to execute

B = np.array([[0, 1], [1, 0], [1, 1], [-1, 0]])
Click here for the solution
X = np.dot(A,B)
X


Author#

S.C.

Change Log#

Date

Version

Change Description

08-08-2021

0.1

First edition