Reading Documentation (NumPy)
Table of Contents
- 1) การอ่าน documentation
- 2) ฟังก์ชันเพิ่มเติมใน NumPy
- 3) Statistics
1) การอ่าน documentation
- Extension library ส่วนใหญ่จะมีเอกสารประกอบการใช้งานเรียกว่า documentation
- ทักษะในการอ่าน Documentations เป็นสิ่งสำคัญในการที่จะนำเอา extension library หนึ่งๆ มาใช้
- NumPy เป็น extension library สำหรับการคำนวณทางวิทยาศาสตร์ด้วย Python
- lab นี้จะพยายามฝึกวิธีการอ่าน documentation และการอ่านตัวอย่าง code คนอื่นเพื่อนำมาปรับใช้ตามที่เราต้องการ
ให้นักเรียนอ่าน documentation หัวข้อ How to create a basic array แล้วลองตอบผลลัพธ์จากคำถามต่อไปนี้
โดย method .tolist()
(อ่านว่า to-list) เป็นการแปลง NumPy array ให้เป็น list เพื่อใช้ในการตอบคำถาม หากนำคำสั่งไปรันในที่อื่นเช่น labpy แล้วไม่จำเป็นต้องใช้ .tolist()
ต่อท้าย ตัวอย่างเช่น
คำสั่ง np.array([1, 2, 3]).tolist()
สามารถใช้เพียง np.array([1, 2, 3])
ได้เลย ซึ่ง numpy จะแสดงผลอย่างกระชับและอ่านง่ายกว่า
import numpy as np
print(np.arange(3, 5, .5).tolist())
import numpy as np
print(np.linspace(5, 10, 5).tolist())
import numpy as np
print(np.zeros((1, 2)).tolist())
อ.จะสุ่มทดสอบการใช้คำสั่งหนึ่งในต่อไปนี้ ใน labpy หรือ DataSpell
- np.array
- np.zeros
- np.ones
- np.empty
- np.arange
- np.linspace
2) ฟังก์ชันเพิ่มเติมใน NumPy
2.1) การสร้างด้วยฟังก์ชัน
ใน NumPy นั้นมีฟังก์ชันช่วยในการสร้าง NumPy array เช่น
np.arange(start, stop, step)
: สร้าง array จาก start ... stop (ไม่รวมจุดจบ) ด้วยระยะห่าง stepnp.linspace(start, stop, num)
: สร้าง array จาก start ... stop (รวมจุดจบ) เป็นจำนวน num ตัวด้วยระยะห่างเท่ากันnp.logspace(start, stop, num, [base])
: สร้าง array จาก {base}^{start} ... {base}^{stop} (รวมจุดจบ) เป็นจำนวน num ตัวด้วยระยะห่างตาม logarithm ซึ่งระบุฐาน base ได้np.random.rand(x, y)
: สร้าง array จากการ random เป็นขนาด x \times y ด้วย uniform distribution ระหว่าง [0, 1]np.random.randn(x, y)
: สร้าง array จากการ random เป็นขนาด x \times y ด้วย normal distributionnp.diag
: แปลง array ให้เป็น diagonal matrix
np.random.rand
จะรับ parameter หลายค่า แต่ np.ones
หรือ np.zeros
จะรับ parameter ค่าเดียวเป็น iterable (เช่น tuple หรือ list) จึงใช้งานแตกต่างกัน ตัวอย่างเช่น
หากต้องการสร้างอาเรย์สองมิติขนาด 3x3 ที่เป็นเลขหนึ่งจะใช้ np.ones((3, 3))
แต่หากต้องการสร้างอาเรย์สองมิติขนาด 3x3 ที่สุ่มค่าจะใช้ np.random.rand(3, 3)
(สังเกตจำนวนวงเล็บที่แตกต่างกัน)
ตัวอย่าง
print(np.arange(0, 10, 1)) # arguments: (start, stop, step)
print(np.linspace(0, 10, 25))
print(np.logspace(0, 5, 6, base=2))
print(np.logspace(0, 9, 10, base=np.e))
print(np.random.rand(5,5))
print(np.random.randn(5,5)) # normal distribution
print(np.diag([1,2,3]))
จะได้ผลลัพธ์ดังนี้
[0 1 2 3 4 5 6 7 8 9]
[ 0. 0.41666667 0.83333333 1.25 1.66666667 2.08333333
2.5 2.91666667 3.33333333 3.75 4.16666667 4.58333333
5. 5.41666667 5.83333333 6.25 6.66666667 7.08333333
7.5 7.91666667 8.33333333 8.75 9.16666667 9.58333333
10. ]
[ 1. 2. 4. 8. 16. 32.]
[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
[[0.02238588 0.14438351 0.46594487 0.59054308 0.55954768]
[0.00760499 0.10199877 0.19610801 0.8299523 0.88718408]
[0.8677893 0.8879703 0.64296302 0.3251482 0.08648375]
[0.08923813 0.86195308 0.86911579 0.53686605 0.62865929]
[0.8706121 0.82778993 0.36871406 0.34669655 0.75905492]]
[[-1.65012539 0.29593128 -0.82269413 0.61740689 0.60562402]
[-0.59267369 -0.92237688 -1.60387671 1.05468351 -0.126454 ]
[-0.74207889 -1.15282566 0.25795853 0.60873787 -1.90111561]
[-0.36115385 1.39015934 -0.36396371 -0.21919895 -1.15729297]
[-0.15092988 -1.79662497 0.33198783 1.80902494 -0.23422346]]
[[1 0 0]
[0 2 0]
[0 0 3]]
2.2) การสร้างโดยตรง
ใน NumPy เราสามารถสร้าง vector หรือ matrix ได้ดังนี้
import numpy as np
# declare a vector using a list as the argument
v = np.array([1,2,3,4])
print(v)
# declare a matrix using a nested list as the argument
M = np.array([[1,2],[3,4]])
print(M)
โดยจะเห็นผลลัพธ์
[1 2 3 4]
[[1 2]
[3 4]]
ซึ่งถ้าเราดู type ของทั้งสองตัวแปร v, M
# still the same core type with different shapes
print(type(v), type(M))
จะได้
<class 'numpy.ndarray'> <class 'numpy.ndarray'>
เป็นชนิดเดียวกัน (<class 'numpy.ndarray'>
) เพียงแค่รูปร่างแตกต่างกันเท่านั้น
เราสามารถตรวจสอบขนาดของ NumPy Array ได้ด้วยคำสั่ง .size
print(v.size)
print(M.size)
2.3) การเข้าถึงและกำหนดค่า
NumPy Array สามารถเข้าถึงค่าสมาชิกได้ด้วย []
เหมือน List ใน Python ทั่วไป
เดิม v, M
มีค่าดังนี้
print(v)
print(M)
[1 2 3 4]
[[1 2]
[3 4]]
print(v[0])
print(M[1,1])
print(M[1])
นอกจากการเรียกค่าแล้ว NumPy Array ยังสามารถกำหนดค่าได้ เช่น
M[0,0] = 7 # assign new value
print(M)
จะได้
[[7 2]
[3 4]]
และสามารถกำหนดค่าทั้งแกนได้ด้วย :
(เรียกว่า fancy indexing) เช่น
M[0,:] = 0
print(M)
จะได้
[[0 0]
[3 4]]
โดย 0, : อ้างถึงสมาชิกแถวที่ 0 ทั้งหมด
เราสามารถใช้การ slicing ใน NumPy Array ได้ เช่น
A = np.array([1,2,3,4,5])
print(A[1:3]) # slicing works just like with lists
จะได้
[2 3]
เนื่องจาก [2 3]
เป็นสมาชิกลำดับที่ 1 .. 2 (ไม่รวม 3) ของ A
2.3.1) กรณีหลายมิติ (ส่วนเสริม)
พิจารณา NumPy Array สองมิติ A
ดังนี้
A = np.array([[n+m*10 for n in range(5)] for m in range(5)])
print(A)
ได้ค่า
[[ 0 1 2 3 4]
[10 11 12 13 14]
[20 21 22 23 24]
[30 31 32 33 34]
[40 41 42 43 44]]
เราสามารถเลือกแถวที่ต้องการใน A
ได้ดังนี้
row_indices = [1, 2, 3]
print(A[row_indices])
จะเลือกแถวตาม row_indices
(1, 2, 3) ออกมาดังนี้
[[10 11 12 13 14]
[20 21 22 23 24]
[30 31 32 33 34]]
2.3.2) Index Masking (ส่วนเสริม)
นอกจากนี้ NumPy Array ยังสามารถทำ index masking หรือการเลือก (mask) สมาชิกตามค่าความจริงได้
B = np.array([n for n in range(5)])
row_mask = np.array([True, False, True, False, False]) # index masking
print(B)
print(B[row_mask])
จะได้เลือกค่าแถวเฉพาะที่ row_mask
มีค่าความจริงเป็น True
คือ
[0 1 2 3 4]
[0 2]
3) Statistics
ใน NumPy จะมีฟังก์ชันทางสถิติให้เลือกใช้อยู่มากมาย ต่อไปนี้จะเป็นตัวอย่างในการใช้งานหาค่าสถิติต่าง ๆ
เราสามารถหาค่า
- A.min(): minimum
- A.max(): maximum
- np.mean(A): เฉลี่ย
- np.std(A): standard deviation
- np.var(A): variance
ได้เช่น
print(A)
print(A.min())
print(A.max())
print(np.mean(A))
print(np.std(A))
print(np.var(A))
จะได้ค่า
[[ 0 1 2 3 4]
[10 11 12 13 14]
[20 21 22 23 24]
[30 31 32 33 34]
[40 41 42 43 44]]
0
44
22.0
14.212670403551895
202.0
ทั้งนี้เราสามารถหาค่าสถิติตามแกนได้ด้วยการใส่พารามิเตอร์ axis
เช่น
print(A)
print(A.min(axis=0))
print(A.max(axis=0))
print(np.mean(A, axis=0))
print(np.std(A, axis=0))
print(np.var(A, axis=0))
จะเป็นการหาค่าสถิติจากแกน 0 (แนวตั้ง)
[[ 0 1 2 3 4]
[10 11 12 13 14]
[20 21 22 23 24]
[30 31 32 33 34]
[40 41 42 43 44]]
[0 1 2 3 4]
[40 41 42 43 44]
[20. 21. 22. 23. 24.]
[14.14213562 14.14213562 14.14213562 14.14213562 14.14213562]
[200. 200. 200. 200. 200.]
นอกจากนี้ยังมีคำสั่งอื่น ๆ อีกเช่น
- np.sum: หาผลรวม
- np.prod: หาผลคูณ
- np.cumsum: หาผลรวมแบบ cumulative
- np.cumprod: หาผลคูณแบบ cumulative
d = np.arange(1, 10)
print(d)
print(np.sum(d))
print(np.prod(d))
print(np.cumsum(d))
print(np.cumprod(d))
จะได้ผลลัพธ์ดังนี้
[1 2 3 4 5 6 7 8 9]
45
362880
[ 1 3 6 10 15 21 28 36 45]
[ 1 2 6 24 120 720 5040 40320 362880]
print(np.sum(np.arange(1, 7)))
print(np.prod(np.arange(1, 7)))
อ.จะสุ่มทดสอบการใช้คำสั่งหนึ่งในต่อไปนี้ ใน labpy หรือ DataSpell
- np.random.rand
- np.mean
- np.std
- np.sum
- np.cumsum
- np.prod
- np.cumprod