NumPy arange() เป็นอีกวิธีหนึ่งในการสร้าง array (เรียกว่า NumPy routines สำหรับสร้าง array) โดยยึด range ของตัวเลขเป็นหลัก สามารถใช้ฟังก์ชั่น arange() สร้าง instance ของ ndarray ที่ค่าของ instance แต่ละตัวมีระยะที่เท่ากัน จากนั้นคืนค่าตัว instance นั้น
Parameters ใน np.arange()
เราสามารถกำหนดระยะห่างและชนิดข้อมูลของค่าแต่ละค่าของสมาชิกใน array ได้ โดยฟังก์ชั่น arange() จะมี parameter ทั้งหมด 4 ตัว
numpy.arange(start, stop, step, dtype)
parameter 3 ตัวแรกกำหนดระยะห่างของค่าของสมาชิก ส่วนตัวสุดท้ายเป็นการกำหนดชนิดข้อมูลของสมาชิกใน array
- start — คือ ตัวเลข (เลขจำนวนเต็มหรือเลขทศนิยม) ที่กำหนดค่าของสมาชิกตัวแรกใน array
- stop — คือ ตัวเลขที่กำหนดค่าของสมาชิกตัวสุดท้ายใน array เป็นการกำหนดแบบ exclusive (ไม่นับค่าที่กำหนด เพราะงั้นค่าของตัวสุดท้ายคือค่าที่อยู่ก่อนหน้าค่าที่กำหนด)
- step — คือ ตัวเลขกำหนดระยะห่างของค่าของสมาชิกแต่ละตัวที่อยู่ติดกัน จะเป็น 0 ไม่ได้ ไม่งั้นจะได้ ZeroDivisionError คิดง่ายๆว่าถ้าเป็นศูนย์ มันก็ขยับไปตัวต่อไปไม่ได้ ต้องบอกในฟังก์ชั่นว่าจะให้มันบวกครั้งละเท่าไหร่
- dtype — คือ ชนิดข้อมูลของสมาชิกใน array ค่าเริ่มต้นอยู่ที่ None หมายความว่า หากไม่กำหนด ชนิดข้อมูลจะถูกเซ็ตไว้ที่ None และฟังก์ชั่นจะประเมินเองว่าชนิดข้อมูลควรเป็นชนิดใด พิจารณาจากชนิดข้อมูลของตัว start stop และ step
Range Arguments ของ np.arange()
arguments ของ NumPy arange() ที่กำหนดค่าของสมาชิกใน array จะต้องสอดคล้องกับ parameters ตัวเลขของ start, stop และ step ต้องใส่อย่างน้อยหนึ่งตัว
ใส่ range arguments ทุกตัว
ทุกครั้งที่ใช้ NumPy ต้อง import NumPy ก่อน
import numpy as np
จากนั้นใช้ฟังก์ชั่น arange() ได้สร้าง array โดยกำหนดค่า range arguments ที่ต้องการ
arr = np.arange(start=1, stop=10, step=2, 'int')
print(arr)
print(arr.dtype)
output:
[1 3 5 7 9]
int64
ในตัวอย่างข้างบนนี้ start คือ 1 ทำให้สมาชิกตัวแรกใน array เริ่มด้วย 1 และ step คือ 2 ทำให้ระยะห่างของค่าแต่ละค่าของสมาชิกเป็น 2 สมาชิกตัวต่อๆไปก็เลยบวกด้วย 2 ก็ได้เป็น 3, 5, 7 ไปเรื่อยๆ ทีนี้ตัว stop มันคือ 10 หมายความว่าค่าของสมาชิกตัวสุดท้ายใน array นี้จะมีค่ามากกว่าหรือเท่ากับ 10 ไม่ได้ ทำให้ค่าของสมาชิกตัวสุดท้ายหยุดอยู่ที่ 9 (ตัวต่อไปมัน 11 ไง ต่อให้เริ่มที่ 0 มันก็จะหยุดที่ 8 เพราะค่าสุดท้ายจะมากกว่าตัว stop ไม่ได้)
จะใส่ range arguments ตามตำแหน่งเฉยๆ ก็ได้ คือไม่ต้องระบุว่าอันไหนคือ start, stop, step เพราะระบบมันรู้อยู่แล้วว่าตัวแรกเป็น start ตัวที่สองเป็น stop และตัวที่สามเป็น step
arr = np.arange(1,15,2, 'int')
print(arr)
print(arr.dtype)
output:
[1 3 5 7 9 11 13]
int64
ไม่มี 15 เพราะมันต้องน้อยกว่า stop ซึ่งก็คือ 15
วิธีการแบบนี้เค้าเรียกว่า exclusive ใช้เรียกบ่อยมากๆ เวลาสื่อสารกันระหว่างคนเขียนโปรแกรม ถ้าจำได้ก็ดี จะทำให้เข้าใจกันง่ายขึ้น เร็วขึ้น
วิธีที่ตรงกันข้ามกันกับ exclusive คือ inclusive ใน range argument นี้ก็มีตัวที่เป็น inclusive อยู่ นั้นคือค่า start นั่นเอง inclusive นี่จำง่ายกว่า คือใช้ตัวที่กำหนดได้เลย เช่น ค่า start คือ 3 ก็เริ่มที่ 3 เลย ไม่ได้เริ่มที่ 2 หรือ 4
ส่วนใหญ่แล้วค่า inclusive มักใช้กับค่าที่เป็นตัว start ใน array เช่น การ slice ใน Python ค่าแรกก็เป็น inclusive เหมือนกัน ส่วน exclusive มักใช้กับตัว stop
ชนิดข้อมูลเป็นทศนิยม
ก็เหมือนจำนวนเต็มที่แสดงตัวอย่างไปแล้วด้านบน ต่างกันที่ถ้ามันมีตัวใดตัวหนึ่งเป็นทศนิยมแล้วเราไม่ได้กำหนดไว้ว่าต้องการให้ชนิดข้อมูลใน array เป็นข้อมูลชนิดใด ระบบมันจะประเมินของมันเองว่ามันควรจะใช้อะไรง่ายสุด
arr = np.arange(1, 11.1, 2)
print(arr)
print(arr.dtype)
output:
[1., 3., 5., 7., 9., 11.]
float64
อันนี้แต่ละอันถูกทำให้อยู่ใส่รูปทศนิยม เพราะค่า stop มันอยู่ใส่รูปทศนิยม ง่ายสุดคือเติมจุด ใส่ 0 หลังจุดหรือไม่ใส่ก็มีค่าเท่ากัน และค่าของสมาชิกตัวสุดท้ายมาได้ถึง 11 เพราะกำหนดค่า stop ไว้ที่ 11.1 ซึ่ง 11.0 มากกว่า 11.1 ก็เลยผ่านมาได้
หรือจะเขียนเป็นจำนวนเต็ม แต่ระบุว่าผลลัพธ์ array ที่ได้ต้องเป็นทศนิยมก็ทำได้ แค่ใส่ argument ใน parameter สุดท้ายแค่นั้นเอง เช่น
arr = np.arange(1,10,3,'float')
print(arr)
print(arr.dtype)
output:
[1. 4. 7.]
float64
ใส่ range arguments 2 ตัว
เราเว้น step ว่างไว้ก็ได้ เพราะค่าเริ่มต้นหรือ default ของ step คือ 1 ถ้าเราเว้นไม่ใส่ step ระบบมันจะนับ step เป็น 1 ไปเลย
arr1 = np.arange(1, 5, 1)
arr2 = np.arange(1, 5)
print(arr1)
print(arr2)
output:
[1 2 3 4 5]
[1 2 3 4 5]
จะเห็นว่าทั้งสอง array ได้สมาชิกมีค่าเท่ากัน
สำคัญ: ถ้าอยากเขียนแค่ 2 arguments อันแรกต้องเป็น start อันที่สองต้องเป็น stop อย่าสลับกัน และไม่ต้องเขียนระบุก็ได้ว่า parameter ไหนอยู่ตรงไหน เพราะระบบมันรู้ของมันอยู่แล้ว
ใส่ argument 1 ตัว
ย่อกันให้สุด และสามารถทำได้ด้วย เพราะกฏที่กำหนดไว้คือต้องใส่ parameter อย่างน้อยหนึ่งตัว แต่เมื่อเขียนแบบนี้แล้ว step จะเป็น 1 เท่านั้น start จะเป็น 0 และค่าเดียวที่ใส่ได้คือค่า stop ส่วนชนิดข้อมูลระบบจะดูว่าชนิดข้อมูลที่ใส่ในค่า stop เป็นข้อมูลชนิดใด ไม่สามารถกำหนดค่า dtype ได้ ถ้าฝืนใส่มันจะเป็น TypeError
arr = np.arange(5)
print(arr)
print(arr.dtype)
output:
[0 1 2 3 4]
int64
สำคัญ: ใส่ 1 argument อย่าไปเขียนระบุว่าค่านี้เป็นค่า stop เพราะมันนับเป็นค่า stop ก็จริง แต่โดยพื้นฐานแล้วตัวเลขตัวแรกใน parameter มันต้องเป็นตัว start ดังนั้นถ้าเริ่มฟังก์ชั่นแล้วไปบอกมันว่า stop เท่ากับค่านี้นะ มันจะโยน TypeError มาให้เลย
ที่มันสามารถใส่แค่ค่าเดียว แบบไม่ระบุว่าเป็นค่าอะไรแล้วมันไม่ TypeError เพราะตามระบบแบบถูกต้อง ค่าแรกที่ปรากฏมันต้องเป็นค่า start แต่พอมันเห็นว่าไม่มีตัว stop มันก็เลยเอาค่านั้นไปเป็นค่า stop แทน (หากไม่มีการจุดสิ้นสุด มันน่าจะเป็นประเด็นคล้ายๆ infinite loop คือไปเรื่อยๆจนเครื่องค้างไปเลย อันนั้นก็นับเป็น error อันนึง)
ใส่ arguments เป็นจำนวนเต็มลบ
step เป็นจำนวนเต็มบวก
หากใส่ค่า start และ stop เป็นจำนวนเต็มลบ แต่ค่า step เป็นจำนวนเต็มบวก ก็จะมีวิธีคิดเหมือนกับฟังก์ชั่น arange() อื่น ต่างกันแค่เริ่มจำนวนเป็นตัวเลขติดลบแล้วบวกเพิ่มไปเรื่อยๆเท่านั้นเอง
neg = np.arange(-6, -1, 2, 'float')
print(neg)
print(neg.dtype)
output:
[-6. -4. -2.]
float64
สำคัญ: ค่า stop > start เมื่อ step เป็นจำนวนเต็มบวก
ไม่งั้นได้ array ว่าง เพราะการที่ step เป็นบวกคือการเอาค่า step ไปบวกค่าสมาชิกก่อนหน้า จนกว่าจะได้ตัว stop ทีนี้ถ้าค่า stop มันน้อยกว่าค่าเริ่มต้นซะแล้ว แล้วค่า step ยังเป็นบวกอีก จะบวกยังไงจำนวนมันก็ไม่สามารถมีค่าน้อยลงได้
step เป็นจำนวนเต็มลบ
ถ้าใส่ค่า step เป็นลบ ก็คือเอามาลบออกจากค่า start จนกว่าจะได้ค่า stop ไม่ว่าค่า start และ stop จะเป็นบวกหรือลบก็ตาม
arr = np.arange(6, -2, -3)
print(arr)
output:
[6 3 0]
อีกตัวอย่างหนึ่ง เป็นลบทั้ง start และ stop
arr = np.arange(-6, -15, -3)
print(arr)
output:
[-6 -9 -12]
เมื่อเป็นการลบออกแบบนี้ การนับแบบ exclusive จะเป็นการนับแบบกลับหลังด้วย คือ จากที่ค่าสุดท้ายจะมากกว่าหรือเท่ากับค่า stop ไม่ได้ ก็กลายเป็นค่าสุดท้ายจะน้อยกว่าหรือเท่ากับค่า stop ไม่ได้ ทำให้ค่าสุดท้ายในตัวอย่างล่าสุดมีค่า -12 เพราะหากนับถอยหลังตัวถัดไปมันจะได้ -15 ซึ่งเท่ากับ stop พอดี จึงต้องหยุดที่ -12
สำคัญ: คล้ายกับข้อสำคัญอันที่แล้ว
ค่า stop < start เมื่อ step เป็นจำนวนเต็มลบ
ไม่งั้นได้ array ว่าง เพราะจะลบออกยังไง มันก็ทำให้ได้ค่าเพิ่มขึ้นไม่ได้
ใช้ np.arange() ขั้นสูงขึ้น
เราสามารถใช้ np.arange() กับ mathematical operators (บวก ลบ คูณ หาร) หรือ NumPy routines อื่นๆ เช่น abs() กับ sin() เป็นต้น
arr = np.arange(3)
arr = arr*2
print(arr)
output:
[0 2 4]
ด้านบนเป็นการคูณค่าที่ได้จากการสร้าง array ด้วย np.arange ด้วย 2
ค่าแรกที่ได้คือ [0 1 2]
คูณทุกค่าด้วย 2 ได้เป็น [0 2 4]
arr = np.arange(-6, -15, -3)
arr = np.abs(arr)
print(arr)
output:
[6 9 12]
ตัวอย่างถัดมาเป็นการเอา np.arange มาใช้กับ routine ที่ np.abs() เป็นการหาค่า absolute ของจำนวน
arr = np.arnage(3)
arr = np.sin(arr)
print(arr)
output:
[0. 0.84147098 0.90929743]
ตัวอย่างสุดท้ายเป็นการหาค่า sin ด้วย routine np.sin() จาก array ที่ได้มาจากการสร้างด้วย routine np.arange()