Home / Reading Documentation (NumPy)

Reading Documentation (NumPy)

You are not logged in.

If you are a current student, please Log In for full access to this page.

Table of Contents

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())

Checkoff 1:

อ.จะสุ่มทดสอบการใช้คำสั่งหนึ่งในต่อไปนี้ ใน labpy หรือ DataSpell

  • np.array
  • np.zeros
  • np.ones
  • np.empty
  • np.arange
  • np.linspace

top

2) ฟังก์ชันเพิ่มเติมใน NumPy

2.1) การสร้างด้วยฟังก์ชัน

ใน NumPy นั้นมีฟังก์ชันช่วยในการสร้าง NumPy array เช่น

  • np.arange(start, stop, step): สร้าง array จาก start ... stop (ไม่รวมจุดจบ) ด้วยระยะห่าง step
  • np.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 distribution
  • np.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)))

Checkoff 2:

อ.จะสุ่มทดสอบการใช้คำสั่งหนึ่งในต่อไปนี้ ใน labpy หรือ DataSpell

  • np.random.rand
  • np.mean
  • np.std
  • np.sum
  • np.cumsum
  • np.prod
  • np.cumprod

top