เมื่อเราเริ่มสำรวจ Machine Learning หรือ Data Science เรามักจะพบว่ามีการใช้อาร์เรย์ NumPy บ่อยมากแทนที่จะเป็นรายการ Python ในฐานะมือใหม่ เป็นเรื่องยากมากที่จะเข้าใจว่าเหตุใดเราจึงทำเช่นนี้ มันดูค่อนข้างคล้ายกับผู้เริ่มต้น ดังนั้น วันนี้ฉันจะพยายามแสดงภาพว่าทำไมเราจึงควรใช้อาร์เรย์ NumPy แทนรายการหลาม
สมมติว่าเราต้องคูณสองรายการตัวเลขและส่งออกผลรวมของรายการผลลัพธ์เป็น python แล้วเราจะทำอย่างไร? มีแนวทางที่ไร้เดียงสามากดังต่อไปนี้:
list1 = [1, 3, 4] list2 = [4, 5, 6] result = list1[0]*list2[0] + list1[1]*list2[1] + list1[2]*list2[2] print(result)
แต่จะเกิดอะไรขึ้นถ้ามี 1,000 หมายเลขในรายการ? ตอนนี้คุณสามารถพูดได้ว่าเราสามารถใช้การวนซ้ำเพื่อทำมันได้
list1 = [1, 3, 4, 7, 9, 11] list2 = [4, 5, 6, 8, 12, 14] result = 0 for i in range(0, len(list1)): result += (list1[i] * list2[i]) print(result)
แม้ว่าการใช้งานนี้จะดีกว่าครั้งแรกเล็กน้อย แต่ก็ยังไม่ได้มีประสิทธิภาพมากนัก เพื่อให้มีประสิทธิภาพมากขึ้น ตอนนี้ฉันจะแนะนำให้คุณรู้จักกับอาร์เรย์ NumPy ก่อนอื่นเลย ฉันจะแปลงสองรายการที่กำหนดให้เป็นอาร์เรย์ NumPy
import numpy as np # it is an unofficial standard to use np for numpy # this line will convert the list into numpy array arr1 = np.array(list1) arr2 = np.array(list2)
ตอนนี้ เราจะใช้ ฟังก์ชัน NumPy Dotเพื่อทำงานของเรา
result = np.dot(arr1, arr2) print(result)
วิธีการนี้เรียกว่าการทำให้เป็นเวกเตอร์ ฟังก์ชัน NumPy dot นี้เป็นการนำการดำเนินการ dot product ไปใช้แบบเวกเตอร์ระหว่างเวกเตอร์สองตัว และโดยเฉพาะอย่างยิ่งเมื่อ n (ความยาวของรายการ) มีขนาดใหญ่ สิ่งนี้จะทำงานได้เร็วกว่าตัวอย่างโค้ดสองตัวอย่างก่อนหน้ามาก ฉันต้องการเน้นย้ำว่าจริงๆ แล้วการทำให้เป็นเวกเตอร์มีประโยชน์ที่แตกต่างกันสองประการ อย่างแรกคือทำให้โค้ดสั้นลง ตอนนี้เหลือแค่โค้ดบรรทัดเดียว ไม่เจ๋งเหรอ? ประการที่สอง ยังส่งผลให้โค้ดของคุณทำงานได้เร็วกว่าการใช้งานทั้งสองครั้งก่อนหน้านี้ที่ไม่ได้ใช้การทำให้เป็นเวกเตอร์ เหตุผลที่การใช้งานแบบเวกเตอร์เร็วกว่ามากนั้นอยู่เบื้องหลัง ฟังก์ชัน NumPy dot สามารถใช้ฮาร์ดแวร์แบบขนานในคอมพิวเตอร์ของคุณได้ และสิ่งนี้จะเกิดขึ้นจริงไม่ว่าคุณจะใช้งานบนคอมพิวเตอร์ปกติ บน CPU ของคอมพิวเตอร์ปกติ หรือหากคุณใช้ GPU ซึ่งเป็นหน่วยประมวลผลกราฟิก บ่อยครั้ง ใช้เพื่อเร่งงานการเรียนรู้ของเครื่อง ความสามารถของฟังก์ชัน NumPy dot ในการใช้ฮาร์ดแวร์แบบขนานทำให้มีประสิทธิภาพมากกว่า for loop หรือการคำนวณตามลำดับที่เราเห็นก่อนหน้านี้ ตอนนี้เวอร์ชันนี้ใช้งานได้จริงมากขึ้นเมื่อ n มีขนาดใหญ่
ตอนนี้ เราจะดูว่าการทำให้เป็นเวกเตอร์เร็วขึ้นจริงหรือไม่ หากต้องการดูสิ่งนี้ให้รันโค้ดที่ระบุด้านล่าง
a = np.random.rand(10000000) # very large arrays b = np.random.rand(10000000) tic = time.time() # capture start time c = np.dot(a, b) toc = time.time() # capture end time print(f"np.dot(a, b) = {c:.4f}") print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ") tic = time.time() # capture start time c = my_dot(a,b) toc = time.time() # capture end time print(f"my_dot(a, b) = {c:.4f}") print(f"loop version duration: {1000*(toc-tic):.4f} ms ") del(a);del(b) #remove these big arrays from memory # this code is taken from 'Machine Learning Specialization' course of Coursera.
ผลลัพธ์ของโค้ดคือ:
np.dot(a, b) = 2501072.5817 Vectorized version duration: 191.1116 ms my_dot(a, b) = 2501072.5817 loop version duration: 10142.9269 ms
ดังนั้น การทำให้เป็นเวกเตอร์จะให้ความเร็วที่มากขึ้นในตัวอย่างนี้ นี่เป็นเพราะว่า NumPy ใช้ประโยชน์จากความเท่าเทียมของข้อมูลที่มีอยู่ในฮาร์ดแวร์พื้นฐานได้ดีขึ้น นี่เป็นสิ่งสำคัญใน Machine Learning ซึ่งชุดข้อมูลมักจะมีขนาดใหญ่มาก
โดยสรุป การทำเวกเตอร์จะทำให้โค้ดของคุณสั้นลง ดังนั้นหวังว่าจะเขียนได้ง่ายขึ้นและง่ายขึ้นสำหรับคุณหรือคนอื่นๆ ในการอ่าน และยังช่วยให้ทำงานเร็วขึ้นอีกด้วย
การใช้อาร์เรย์ NumPy มีความสำคัญมากกว่า ฉันเพิ่งสาธิตหนึ่งในนั้นให้เข้าใจง่าย