เมื่อเราเริ่มสำรวจ 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 มีความสำคัญมากกว่า ฉันเพิ่งสาธิตหนึ่งในนั้นให้เข้าใจง่าย