[TH] ulab EP 5 numerical

บทความ ulab ตอนที่ 5 เป็นเรื่องของโมดูลย่อย numerical ที่ใช้ในการคำนวณหาค่าน้อยสุด มากสุด ผลรวม ค่าเฉลี่ย และค่าเบียงเบนมาตรฐาน ทำให้ทำงานด้านการคำนวณสถิติเบี้องต้นได้สะดวก โดยบทความอธิบายฟังก์ชันการทำงานของโมดูลย่อย numerical พร้อมตัวอย่างโปรแกรมเพื่อให้เห็นภาพของการทำงาน

numerical

โมดูลย่อย numerical เป็นการทำงานดังต่อไปนี้กับข้อมูล ndarray โดยฟังก์ชันสำหรับใช้งานเป็นดังนี้

  1. ผลลัพธ์ = ulab.numerical.flip(M, axis=0) กลับตำแหน่งของแถวลำดับตาม axis ดังนี้
    axis = 0 กลับด้านในแกนนอน (horizontal)
    axis = 1 กลับด้านในแกนตั้ง (vertical)
  2. ulab.numerical.roll(M, shift, axis=0) เลื่อนข้อมูลจำนวน shift (ถ้าเป็นค่าบวกจะเป็นเลื่อนซ้ายหรือลงล่าง, ถ้าเป็นค่าลบจะเลื่อนขวาหรือขึ้นบน) ตามแกนที่กำหนดใน axis ดังนี้
    axis = 0 เลื่อนแกนนอน
    axis = 1 เลื่อนแกนตั้ง
  3. ulab.numerical.sort(M, axis=0) เรียงข้อมูลในแถวลำดับตามแกนที่กำหนด
  4. ผลลัพธ์ = ulab.numerical.argsott(M,axis=0) สร้างแถวลำดับผลลัพธ์ของลำดับในการจัดเรียงของข้อมูลจากแถวลำดับ M

นอกจากนี้ยังมีฟังก์ชันสำหรับใช้กับแถวลำดับ 1 มิติ ดังนี้

  1. ผลลัพธ์ = ulab.numerical.min( M ) หาค่าที่น้อยที่สุดใน M
  2. ผลลัพธ์ = ulab.numerical.max( M ) หาค่าที่มากที่สุดใน M
  3. ผลลัพธ์ = ulab.numerical.argmin( M ) หาค่าที่น้อยที่สุดใน M และคืนค่าตำแหน่งที่พบ
  4. ผลลัพธ์ = ulab.numerical.argmax( M ) หาค่าที่มากที่สุดใน M และคืนค่าตำแหน่งที่พบ
  5. ผลลัพธ์ = ulab.numerical.sum( M ) หาผลรวมของ M
  6. ผลลัพธ์ = ulab.numerical.mean( M ) หาค่าเฉลี่ยของ M
  7. ผลลัพธ์ = ulab.numerical.std( M ) หาค่าเบี่ยงเบนมาตรฐานของ M

ตัวอย่างโปรแกรม 1

ตัวอย่างโปรแกรม code18-11 เป็นตัวอย่างการใช้งานฟังก์ชันการกลับค่าของแถวลำดับ การเลื่อนแถวลำดับ และการเรียงแถวลำดับทั้งแบบ 1 มิติและ 2 มิติ ซึ่งได้ผลลัพธ์ของตัวอย่างดังภาพที่ 1

# code18-11
import ulab as np
import time
import esp32

data1d = np.array([1,3,5,7,9],dtype=np.float)
data2d = np.array([[3,5,7],[9,11,13],[15,17,19]], dtype=np.float)

print("Original 1D ..... : {}".format(data1d))
print("Original 2D ..... : {}".format(data2d))
print("1D flip ......... : {}".format(np.numerical.flip(data1d)))
np.numerical.roll(data1d,-1)
print("1D left ......... : {}".format(data1d))
np.numerical.roll(data1d,1)
print("1D right ........ : {}".format(data1d))
print("2D H-flip ....... : {}".format(np.numerical.flip(data2d,axis=0)))
print("2D V-flip ....... : {}".format(np.numerical.flip(data2d,axis=1)))
np.numerical.roll(data2d,-1, axis=0)
print("2D H-left ....... : {}".format(data2d))
np.numerical.roll(data2d, 1, axis=0)
print("2D H-right ...... : {}".format(data2d))
np.numerical.roll(data2d,-1, axis=1)
print("2D V-up ......... : {}".format(data2d))
np.numerical.roll(data2d, 1, axis=1)
print("2D V-down ....... : {}".format(data2d))
np.numerical.sort(data1d)
print("Sorted 1D ....... : {}".format(data1d))
np.numerical.roll(data2d,1,axis=1)
np.numerical.sort(data2d,axis=0)
print("Sorted 2D-H ..... : {}".format(data2d))
np.numerical.roll(data2d,-2,axis=0)
np.numerical.sort(data2d,axis=1)
print("Sorted 2D-V ..... : {}".format(data2d))
np.numerical.roll(data2d,-2,axis=0)
np.numerical.roll(data2d,1,axis=1)
print("argsort 2D-H .... : {}".format(np.numerical.argsort(data2d,axis=0)))
print("argsort 2D-V .... : {}".format(np.numerical.argsort(data2d,axis=1)))
ภาพที่ 1 ตัวอย่างผลลัพธ์จาก code18-11

ตัวอย่างโปรแกรม 2

ตัวอย่างโปรแกรม code18-12 เป็นการสุ่มข้อมูลจำนวน 128 ชุด โดยสุ่มจากผลหารของเวลา ณ ที่กำลังทำงาน หารด้วยผลคูณของอุณภูมิของ ESP32 คูณกับค่าแม่ความเข็มแม่เหล็กจากเซ็นเซอร์ของ ESP32 หลังจากนั้นนำมาแสดงค่าที่สุ่มได้ หาค่าน้อยสุด มากสุด ผลรวม ค่าเฉลี่ย และค่าเบี่ยงเบนมาตรฐาน ดังตัวอย่างผลลัพธ์ในภาพที่ 2

# code18-12
import ulab as np
import time
import esp32

def rndData(n):
    data = np.array([0]*n,dtype=np.float)
    for i in range(len(data)):
        data[i] = time.ticks_ms()/(esp32.raw_temperature()*esp32.hall_sensor())
    return data

data = rndData(128)
print("data ..... {}".format(data))
print("min ...... {} at {}".format(np.numerical.min(data),np.numerical.argmin(data)))
print("max ...... {} at {}".format(np.numerical.max(data),np.numerical.argmax(data)))
print("sum ...... {}".format(np.numerical.sum(data)))
print("average .. {}".format(np.numerical.mean(data)))
print("std ...... {}".format(np.numerical.std(data)))
ภาพที่ 2 ผลลัพธ์จาก code18-12

สรุป

จากบทนี้จะได้ว่า ผู้เขียนโปรแกรมสามารถสั่งดำเนินการกับแถวลำดับเพื่อกลับค่า เลื่อนค่า จัดเรียง รวมไปถึงประมวลผลค่าของแถวลำดับ 1 มิติเพื่อหาค่าน้อยสุด มากสุด ผลรวม ค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐาน

สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-10