[TH] ulab EP 6 compare

บทความนี้เป็นตอนที่ 6 ของชุด ulab ของ MicroPython ซึ่งเป็นเรื่องของโมดูลย่อยชื่อ compare สำหรับการเปรียบเทียบข้อมูลแถวลำดับที่สร้างจาก ulab ซึ่งภาษาไพธอนไม่ได้สนับสนุนมาแต่ต้น โดยในบทความนี้อธิบายหน้าที่และการใช้งานฟังก์ชันของโมดูลย่อยตัวนี้เพื่อให้รู้จักและนำไปใช้งานต่อไป

compare

โมดูลย่อย compare ที่ใช้สำหรับเปรียบเทียบแถวลำดับ 1 มิติ และ 2 มิติ เพื่อหาความเหมือนกัน แตกต่างกัน เลือกตัวที่มากกว่า หรือเลือกตัวที่น้อยกว่า โดยฟังก์ชันทั้ง 4 มีรูปแบบการใช้งานดังนี้

  1. ผลลัพธ์ = ulab.comapre.clip( M, a, b ) ทำการเปลี่ยนแปลงค่า โดยจะทำการเปลี่ยนแปลงค่าของสมาชิกทุกตัวที่มีค่าน้อยกว่า a ให้เป็น a และถ้าสมาชิกตัวใดมีค่ามากกว่า b จะถูกเปลี่ยนค่าเป็น b ซึ่งการทำงานของฟังก์ชันนี้เหมือนการใช้งาน
    maximum( a, minimum( M, b ) )
  2. ผลลัพธ์ = ulab.comapre.clip( M, N, b ) กรณีที่ M และ N มีสมาชิกเท่ากัน การใช้งานในรูปแบบนี้เป็นการเปรียบเทียบค่าใน M กับ N ถ้าค่าของสมาชิกตัวใดของ M น้อยกว่า N จะเลือกใช้ค่าจาก N และถ้าค่าใดมากกว่า b จะเลือกค่าของ b มาแทน
  3. ผลลัพธ์ = ulab.compare.equal( M, N ) เปรียบเทียบ M กับ N ให้คำตอบเป็น True ถ้าเหมือนกัน แต่ถ้าแตกต่างกันให้คำตอบเป็น False
  4. ผลลัพธ์ = ulab.compare.not_equal( M, N ) เปรียบเทียบ M กับ N ให้คำตอบเป็น True ถ้าแตกต่างกันกัน แต่ถ้าเหมือนกันกันให้คำตอบเป็น False
  5. ผลลัพธ์ = ulab.comapre.maximum( M, N ) เปรียบเทียบ M กับ N ถ้าสมาชิกตัวใดของแถวลำดับทั้งสองมีค่ามากกว่าจะถูกเลือกออกมาเป็นผลลัพธ์ของสมาชิกในลำดับนั้น
  6. ผลลัพธ์ = ulab.comapre.minimum( M, N ) เปรียบเทียบ M กับ N ถ้าสมาชิกของแถวลำดับใดมีค่าน้อยกว่าจะถูกเลือกมาเป็นค่าของแถวลำดับที่สร้างขึ้นมาใหม่

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

ตัวอย่างโปรแกรม code18-13 เป็นการสร้างแถวลำดับ M และ N ขนาด 12 ตัวเป็นประเภท int8 หลังจากนั้นเปรียบเทียบว่าสมาชิกแต่ละตัวเหมือนกัน แตกต่างกันหรือไม่ หลังจากนั้นหาแถวลำดับที่น้อยกว่าและมากกว่าจากการเปรียบเทียบ M และ N สุดท้ายทำการคลิปข้อมูล และได้ผลลัพธ์ดังภาพที่ 1

# code18-13
import ulab as np

M = np.array(range(12), dtype=np.int8)
N = np.linspace(12,1,12,dtype=np.int8)

print("M == N ? {}".format(np.compare.equal(M, N)))
print("M != N ? {}".format(np.compare.not_equal(M, N)))
print("minimum(M,N) = {}".format(np.compare.minimum(M,N)))
print("maximum(M,N) = {}".format(np.compare.maximum(M,N)))
print("clip(M,5,10) = {}".format(np.compare.clip(M,5,10)))
print("clip(M,N,10) = {}".format(np.compare.clip(M,N,10)))

ภาพที่ 1 ผลลัพธ์จากcode18-13

สรุป

จากบทความนี้จะเห็นว่า การเปรียบเทียบของแถวลำดับนั้นเป็นการเปรียบเทียบกับข้อมูลสมาชิกแบบตัวต่อตัว ดังนั้น จำนวนของสมาชิกของแถวลำดับที่นำมาเปรียบเทียบกันจะต้องมีจำนวนที่เท่ากัน แต่สามารถมีประเภทที่แตกต่างกันได้ เนื่องจากเป็นการเปรียบเทียบค่าของสมาชิกแต่ละตำแหน่ง และนอกจากนี้ ผลลัพธ์ของการเปรียบเทียบจะเป็นแถวลำดับใหม่ที่มีจำนวนสมาชิกเท่ากับแถวลำดับที่เปรียบเทียบกัน แต่ข้อมูลที่จัดเก็บขึ้นอยู่กับฟังก์ชันที่เรียกใช้ เช่น minimum จะได้แถวลำดับใหม่ที่สมาชิกแต่ละตัวล้วนเป้นค่าที่น้อยที่สุดจากแถวลำดับ 2 ตัวที่นำมาเปรียบเทียบกัน ฟังก์ชัน clip จะได้ผลลัพธ์ของแถวลำดับใหม่ที่สมาชิกจะมีค่าที่ไม่น้อยกว่า a และไม่มากกว่า b เป็นต้น

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

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