ภาษาไพธอนเป็นภาษาที่โดดเด่นเนื่องจากการที่มีมอดูล (ไลบรารี) เสริมต่างๆมากมายครอบคลุมการใช้งานหลากหลาย
ในจำนวนมอดูลมากมายเหล่านั้น numpy และ matplotlib เป็น ๒ มอดูลเสริมในภาษาไพธอนที่มีความสำคัญและใช้กันอย่างแพร่หลายที่สุด
numpy ใช้ในการคำนวณเชิงตัวเลขและวิเคราะห์ข้อมูล ส่วน matplotlib ใช้แสดงผลข้อมูลออกมาเป็นกราฟหรือแผนภาพต่างๆ
๒ มอดูลนี้ที่จริงแล้วไม่ได้มาจากที่เดียวกัน ไม่ได้มีความเกี่ยวข้องกันโดยตรง แต่สาเหตุที่นำ ๒ อย่างนี้มาเขียนรวมกันเป็นเรื่องเดียวเพราะว่าเป็นมอดูลที่มักจะถูกใช้ร่วมกันเสมอ ดังนั้นแทนที่จะอธิบายทีละอย่าง อธิบายควบคู่กันไปจะทำให้เห็นภาพง่ายขึ้น เพราะทั้ง numpy และ matplotlib นั้นต่างเสริมซึ่งกันและกัน
กล่าวคือเรามักจะใช้ numpy เพื่อคำนวณและวิเคราะห์ข้อมูล จากนั้นจึงใช้ matplotlib เพื่อนำข้อมูลออกมาแสดงผลเป็นกราฟและแผนภาพเพื่อให้เห็นภาพชัด
เนื่องจากว่าเป็นมอดูลเสริมดังนั้นจึงไม่ได้ติดตัวมากับภาษาไพธอนโดยตรง ต้องทำการติดตั้งเพิ่ม อย่างไรก็ตามหากใครที่ใช้ IDE หรือแพ็กเกจพิเศษต่างๆเช่น anaconda, enthough canopy, winpython, ฯลฯ ก็จะมี numpy และ matplotlib ติดมาอยู่แล้วให้ดังนั้นจึงขอไม่พูดถึงเรื่องการติดตั้ง
numpy numpy เป็นมอดูลที่สำคัญมากที่สุดในไพธอนเลยก็ว่าได้ เพราะใช้สำหรับการคำนวณทางคณิตศาสตร์ที่มีความซับซ้อน เช่นการเขียนชุดตัวเลขให้อยู่ในรูปแมทริกซ์ ซึ่งทำให้สะดวกต่อการคำนวณมาก
numpy ทำให้เราสามารถใช้ออบเจ็กต์พิเศษชนิดหนึ่งที่ชื่อว่า ndarray ซึ่งเป็นซึ่งเป็นออบเจ็กต์ที่เก็บข้อมูลเป็นกลุ่มเป็นแถว สามารถเก็บเป็นหลายมิติได้และสามารถนำข้อมูลภายในมาคำนวณได้อย่างรวดเร็ว
จริงอยู่ว่าภาษาไพธอนมีข้อมูลชนิดลิสต์ (list) ซึ่งสามารถใช้เขียนแถวตัวเลขเรียงกันหลายๆตัว และยังทำเป็นสองหรือสามหรือหลายมิติได้
เช่นเวลาจะเขียนเมทริกซ์ ๒ มิติ ก็สามารถเขียนเป็น
m = [[1,2],[3,4]]
แต่ลิสต์ไม่ได้ถูกทำมาเพื่อใช้ในการคำนวณโดยเฉพาะทำให้ไม่สามารถคำนวณได้โดยตรง หากเราต้องการจะนำเมทริกซ์มาบวกหรือลบหรือทำอะไรก็ตาม จะพบว่าผลไม่เป็นไปอย่างที่ต้องการ
m1 = [[1,2],[3,4]]
m2 = [[5,6],[7,8]]
print(m1+m2) # ได้ [[1, 2], [3, 4], [5, 6], [7, 8]]
ผลที่ได้ไม่ใช่การนำเมทริกซ์มาบวกกัน ซึ่งผลควรจะได้เป็น [[6, 8], [10, 12]] แต่กลับกลายเป็นการเอามาต่อกัน
หากต้องการให้บวกเมทริกซ์จะต้องทำการวนซ้ำเพื่อให้มีการคำนวณที่ตัวส่วนประกอบแต่ละตัว
m1 = [[1,2],[3,4]]
m2 = [[5,6],[7,8]]
m = [[0,0],[0,0]]
for i in range(2):
for j in range(2):
m[i][j] = m1[i][j]+m2[i][j]
print(m) # ได้ [[6, 8], [10, 12]]
จะเห็นว่ามีความยุ่งยากอยู่ หากสามารถทำให้เขียนแค่ m1+m2 แล้วบวกกันได้เลยแล้วละก็ชีวิตก็คงจะง่ายขึ้นมาก
และสิ่งที่จะตอบโจทย์นี้ได้ก็คือ numpy นั่นเอง ถ้า m1 และ m2 ไม่ใช่ลิสต์แต่เป็นออบเจ็กต์ ndarray ของ numpy แล้วละก็ m1+m2 ก็จะเป็นการบวกเมทริกซ์ทันที นี่คือความสะดวกของ numpy
แต่ว่าไม่ใช่แค่นั้น นอกจากจะทำให้สะดวกต่อการเขียนแล้วยังทำให้การคำนวณเร็วขึ้นมากด้วย เพราะว่า numpy นั้นมีเบื้องหลังการทำงานเป็นภาษาซี
ไพธอนเป็นภาษาที่ถูกออกแบบมาเพื่อให้เขียนง่ายและมีความยืดหยุ่นสูง แต่ก็มีข้อเสียคือทำงานช้าเมื่อเทียบกับภาษาระดับสูงไม่มากอย่างภาษาซีหรือฟ อร์แทรน
ดังนั้นหากสามารถดึงเอาความเร็วของภาษาซีมาใช้ในไพธอนได้ก็จะทำให้เพิ่มความเร็วในการคำนวณได้อย่างมาก
numpy เป็นมอดูลที่ทำงานโดยภาษาซี ดังนั้นจึงมีความเร็วสูงในการคำนวณมากกว่า
ดังนั้นการใช้ numpy นั้นนอกจากจะทำให้เขียนง่ายขึ้นแล้วยังทำให้โปรแกรมเร็วขึ้นกว่าเดิม เรียกได้ว่าไม่มีข้อเสียใดๆในการใช้
ต่อให้เราเขียนออบเจ็กต์หรือฟังก์ชันที่ช่วยในการคำนวณเมทริกซ์ขึ้นมาเองก็ไม่ อาจจะเร็วไปกว่าการใช้ numpy ตราบใดที่เราไม่ได้เขียนบนภาษาซี
นอกจากนี้ยังมีมอดูลสำคัญอีกตัวที่ถูกสร้างขึ้นมาเสริมจาก numpy ก็คือ scipy ซึ่งเป็นมอดูลที่ประกอบไปด้วยคำสั่งต่างๆที่ช่วยในการคำนวณทางคณิตศาสตร์ เพื่อใช้ในด้านวิทยาศาสตร์แขนงต่างๆที่เฉพาะทางขึ้นไปอีก
การใช้งาน scipy นั้นค่อนข้างเป็นเฉพาะทางขึ้นไปมาก ดังนั้นจะยังไม่กล่าวถึงในที่นี้
matplotlib matplotlib เป็นมอดูลที่มีหน้าที่เบื้องต้นคือการวาดกราฟและแผนภาพต่างๆ
แต่ขอบเขตการทำงานจริงๆกว้างขวางกว่านั้น matplotlib สามารถใช้เขียนโปรแกรมจัดการรูปภาพได้ และใช้สร้าง GUI อย่างง่ายได้ด้วย เรียกได้ว่าเป็นมอดูลเอนกประสงค์พอสมควร
การทำงานภายใน matplotlib นั้นต้องพึ่งพา numpy ดังนั้นการจะติดตั้ง matplotlib ก็จะต้องติดตั้ง numpy ไว้ก่อน
ในการเรียกใช้มอดูล numpy และ matplotlib นั้นมักจะถูกย่อโดยมีรูปแบบการย่อที่ค่อนข้างตายตัว นั่นคือ
import numpy as np
import matplotlib.pyplot as plt
np และ plt นั้นเป็นชื่อย่อที่ค่อนข้างใช้กันเป็นสากลดังนั้นต่อจากนี้ก็จะใช้ย่อแบบนี้ตลอด
pyplot เป็นมอดูลย่อยอันหนึ่งของ matplotlib งานโดยหลักๆที่เราใช้นั้นโดยพื้นฐานจะอยู่ใน pyplot เกือบทั้งหมด
ตัวอย่างกราฟที่วาดได้จาก matplotlib
นอกจากนี้ matplotlib ยังมีมอดูลเพิ่มเติมอีกตัวซึ่งถูกสร้างมาเพื่อเสริมเพิ่มความสามารถให้ทำ อะไรได้หลากหลายมากขึ้น นั่นคือ mpl_toolkits
มอดูลย่อยของ mpl_toolkits ที่ชื่อว่า mplot3d นั้นมีไว้ใช้สำหรับวาดกราฟสามมิติ จากที่ matplotlib เดิมนั้นใช้แค่วาดสองมิติเท่านั้น
นอกจากนี้ยังมีมอดูลย่อยอีกตัวที่น่าสนใจคือ basemap เอาไว้จัดการกับแผนที่โลกและวาดภาพบนผิวทรงกลม
อย่างไรก็ตามขอบเขตของเนื้อหาที่จะพูดถึงตรงนี้จะยังไม่ไปถึงเรื่องการใช้ mpl_toolkits แต่หากจะเขียนจะแยกเป็นอีกหัวข้อใหญ่ในภายหลัง
สำหรับคนที่เคยใช้ matlab หรือภาษา IDL มาก่อนจะพบว่าภาษาไพธอนที่ใช้ matplotlib และ numpy + scipy นั้นสามารถใช้ทดแทนได้แทบทุกอย่าง สามารถทั้งทำการคำนวณและวาดกราฟได้อย่างอิสระ และยังดีกว่าตรงที่ไม่มีค่าใช้จ่ายเลย
อีกทั้งภาษาไพธอนใช้งานได้ กว้างขวางเพราะไม่ได้ถูกออกแบบมาให้ใช้งานเฉพาะทางดังนั้นจึงใช้งานได้ ยืดหยุ่นกว่า สามารถหาไลบรารีมาเสริมการใช้งานตามความเหมาะสมได้
อาจเรียกได้ว่า numpy + scipy + matplotlib เป็นสิ่งที่ทำให้ไพธอนทัดเทียม matlab ได้ และเมื่อบวก pandas + scikit-learn + ฯลฯ ก็ทำให้ไพธอนก้าวข้ามเหนือกว่า matlab ขึ้นไปอีก
ขอบเขตเนื้อหาและข้อกำหนด เนื้อหาที่จะพูดถึงในบทความชุดนี้จะเป็นแค่การใช้ numpy และ matplotlib ในระดับเบื้องต้นเท่านั้น ความจริงแล้วทั้ง ๒ มอดูลนี้มีรายละเอียดอะไรๆเยอะมาก แต่จะไม่ลงลึกเพราะจะเยอะเกินไปและก็ไม่ใช่ว่าเราจะต้องใช้งานมันทั้งหมด บางส่วนก็ค่อนข้างเฉพาะทางมาก
ส่วนของ numpy จะพูดถึงการใช้งานทั่วๆไปที่คนส่วนใหญ่น่าจะมีโอกาสได้ใช้ และสามารถเข้าใจได้โดยไม่ต้องใช้ความรู้เฉพาะทาง
ส่วนของ matplotlib จะพูดถึงการวาดกราฟและแผนภาพชนิดต่างๆในสองมิติ และการปรับแต่งอะไรต่างๆเพิ่มเติมในระดับที่ไม่ซับซ้อนเกินไป
สำหรับการทำภาพเคลื่อนไหวและการสร้างระบบส่วนติดต่อผู้ใช้งาน (GUI) เพื่อควบคุมการแสดงผลด้วยเมาส์หรือคีย์บอร์ดนั้นจะยังไม่พูดถึง แต่อาจเขียนเป็นบทความแยกไปอีกหัวข้อใหญ่
สรุปเนื้อหาที่จะไม่ได้รวมในนี้แต่อาจจะเขียนเป็นหัวข้อใหญ่ต่อๆไปในอนาคต
- การวาดกราฟและแผนภาพสามมิติด้วย mpl_toolkits.mplot3d
- การสร้าง GUI ใน matplotlib
- การใช้ numpy และ scipy ในระเบียบวิธีเชิงตัวเลข
- การใช้ pandas เพื่อวิเคราะห์ข้อมูล
เรื่องเหล่านี้ล้วนน่าสนใจทั้งนั้น แต่ไม่ว่าจะอันไหนก็มีพื้นฐานมาจากเนื้อหา numpy และ matplotlib เบื้องต้นนี้
สำหรับเรื่องของเวอร์ชันไพธอนที่ใช้นั้น numpy กับ matplotlib มีลักษณะการเขียนที่ใช้แทนกันได้แทบไม่ต่างกันในไพธอน 2 และ 3 ดังนั้นโค้ดที่เขียนสามารถใช้ได้เหมือนกัน
รูปแบบการเขียนบทความนี้ นั้นเขียนให้รองรับทั้งไพธอน 2 และ 3 ซึ่งต่างจากบทความภาษา python เบื้องต้นที่เคยเขียนไว้ซึ่งเน้นไปที่ไพธอน 3 เพียงอย่างเดียว
ข้อควรระวังหลักๆก็คือการใส่ข้อความที่มีภาษาไทยหรือสัญลักษณ์พิเศษลงกราฟใน ไพธอน 2 จำเป็นจะต้องใส่ u นำหน้าเป็น u'ข้อความ' เพื่อให้เป็นยูนิโค้ดไม่เช่นนั้นจะเกิดข้อผิดพลาด ในขณะที่ในไพธอน 3 ไม่ต้อง ดังนั้นเพื่อให้นำไปใช้ในไพธอน 2 ได้ด้วยจะใส่ u ทุกครั้งที่ใส่ภาษาไทยหรือสัญลักษณ์พิเศษ
นอกจากนี้ก็มีเรื่องหาร ตัวเลข ที่เวลาหารเลขจำนวนเต็มในไพธอน 2 จะมีการปัดเศษทิ้ง ทำให้ต้องเติมจุดหลังตัวเลขตัวใดตัวหนึ่งทุกครั้ง นี่ก็ทำให้เกิดความต่างที่เห็นได้ชัด
ความรู้พื้นฐานที่ควรจะจำเป็นสำหรับการอ่านเนื้อหาในส่วนตรงนี้ก็คือไพธอนเบื้องต้นจนถึงบทที่ ๑๖ แต่ถ้าจะให้ดีควรถึงบทที่ ๒๒ เพื่อให้เข้าใจเรื่องคลาสและการเขียนโปรแกรมเชิงวัตถุ ซึ่งจำเป็นต่อการเข้าใจ matplotlib มากพอสมควร
matplotlib ถูกออกแบบมาให้ใช้งานได้ค่อนข้างง่ายในเบื้องต้น ต่อให้ไม่ต้องทำความเข้าใจกลไกภายในโดยลึกก็สามารถเขียนกราฟอย่างง่ายๆได้ แต่ชำนาญมากขึ้นจะสามารถปรับแต่งอะไรได้อย่างอิสระมากขึ้นตามลำดับ ดังนั้นจึงเหมาะกับการใช้งานตั้งแต่ระดับต้นไปจนถึงระดับสูง
จริงอยู่ว่าความรู้ภาษาไพธอนแค่พื้นฐานในระดับไม่สูงมากก็อาจสามารถใช้ matplotlib เบื้องต้นได้แล้ว โดยอาจไม่ต้องเข้าใจเรื่องระบบการเขียนโปรแกรมเชิงวัตถุ และอาจไม่ต้องใช้ numpy ด้วยก็ได้ แต่ว่าเพื่อที่จะสามารถใช้งานได้อย่างเต็มประสิทธิภาพจึงแนะนำให้เข้าใจ เรื่องการเขียนโปรแกรมเชิงวัตถุก่อนที่จะมาอ่านดีกว่า เพราะเนื้อหาที่จะอธิบายนั้นจะลงไปลึกในระดับนึง
เนื้อหาจะประกอบด้วยส่วนของ numpy กับ matplotlib สลับกันไปเรื่อยๆ แต่หากใครสนใจแค่ numpy ก็อ่านแค่เฉพาะบทที่เกี่ยวกับ numpy และข้ามส่วนของ matplotlib ได้ ไม่มีปัญหา
ในขณะเดียวกัน ใครที่ต้องการอ่านแค่ส่วนของ matplotlib อย่างเดียวจำเป็นจะต้องมีพื้นฐาน numpy มาแล้ว หากยังไม่มีพื้นฐานก็ควรอ่านเนื้อหาส่วน numpy ก่อน ไม่ค่อยแนะนำให้ใช้ matplotlib โดยไม่รู้ numpy
บทไหนเป็นเรื่องของ numpy หรือ matplotlib สามารถดูได้จากหน้าสารบัญ ถ้ามีวงเล็บ [np.] ก็เป็น numpy ถ้ามี [plt.] หรือ [mpl.] ก็เป็น matplotlib หรือบางบทอาจมีทั้งคู่
อ้างอิง