.reshape() เป็น attribute ที่ใช้ในการเปลี่ยน shape ของ array เราสามารถเพิ่ม/ลบ/ดัดแปลง จำนวนสมาชิกและคอลัมน์ของแต่ละแถวในมิติได้โดยไม่แก้ไขค่าของสมาชิกใน array

พูดง่ายๆคือ การเปลี่ยนมิติของ array นั้นๆ

ndarray.reshape

สามารถเปลี่ยนจากมิติใดเป็นมิติใดก็ได้ ตราบใดที่สามารถเอาข้อมูลทั้งหมดออกมาจัดเป็นมิติได้โดยที่ไม่มีตัวใดตกหล่นไป

เช่น หากต้องการเปลี่ยนข้อมูล array 1 มิติ ที่มีจำนวนสมาชิกทั้งหมด 12 ตัว เป็น array 2 มิติ เราก็อาจจะจัดข้อมูล 12 ตัวนี้ให้อยู่ในแถว 3 แถว อันนี้ทำได้ เพราะจะได้แถวละ 4 ตัวพอดี

ทีนี้สมมุติเราต้องการจุดกลุ่มให้มันออกเป็น 5 แถวล่ะ ทำได้ไหม? คำตอบคือ ทำไม่ได้ เพราะถ้าแบ่งออกเป็น 5 แถว แถวแรกจัดได้ 5 ตัว แถวที่สองจัดได้อีก 5 ตัว กลายเป็นทั้งหมด 10 ตัวแล้วอีก 2 ตัวมันเอามาจัดไม่ได้ มันไม่ครบตาราง มันเป็นเศษเกิน

1-D เป็น 2-D

เปลี่ยนจาก 1 มิติเป็น 2 มิติ ให้เอาจำนวนสมาชิกทั้งหมดของ array นั้นหารจำนวนแถวที่ต้องการ หากหารได้ลงตัว หมายความว่าสามารถจัด array นั้นให้อยู่ในแถวนั้นได้พอดี โดยแต่ละแถวจะมีจำนวนคอลัมน์ตามผลหารที่ได้

ตัวอย่าง

จากตัวอย่างใช้ฟังก์ชั่น np.arange() สร้าง array แบบหนึ่งมิติ มีสมาชิกตั้งแต่ 1-20 ทั้งหมด 20 ตัว จากนั้นใช้ attribute reshape() เปลี่ยนมิติเป็น 2 มิติ โดยให้มีแถว 5 แถว แต่ละแถวมีสมาชิก 4 ตัว

1-D เป็น 3-D

การเปลี่ยนจาก 1 มิติ เป็น 3 มิติ ให้คิดก่อนว่าจะจัดข้อมูลทั้งหมดออกเป็นกี่กลุ่ม จากนั้นเอาจำนวนทั้งหมด หารด้วยจำนวนกลุ่มที่คิดว่าจะจัด (ต้องหารได้ลงตัวพอดีจึงจะจัดกลุ่มได้) ผลลัพธ์ที่ได้จากการหาร คือจำนวนสมาชิกในแต่ละกลุ่มว่าแต่ละกลุ่มจะมีสมาชิกกี่ตัว
ขั้นตอนต่อมาคือ การจัดสมาชิกของแต่ละกลุ่มออกเป็นแต่ละแถวเท่าๆกัน

เช่น

จากตัวอย่างใช้ฟังก์ชั่น np.arange() สร้าง array ที่มีค่าตั้งแต่ 1-24 มีสมาชิกทั้งหมด 24 ตัว มี 1 มิติ จากนั้นใช้ attribute reshape() เปลี่ยนมิติเป็น 3 มิติ โดยจัดสมาชิกทั้งหมดออกเป็น 3 กลุ่ม (24/3 = 8) โดยแต่ละกลุ่มจะมีสมาชิกทั้งหมด 8 ตัว จากนั้นจัดสมาชิกออกเป็นกลุ่มละ 2 แถวเท่าๆกัน (8/2 = 4) ในแต่ละแถวจะมีสมาชิก 4 ตัว

เปลี่ยน array ใดๆเป็น 1 มิติ

ใส่ค่า -1 ใน parameter ของ attribute reshape() จะเปลี่ยนมิติใดๆก็ตามของ array นั้นเป็น 1 มิติ

เช่น

ในตัวอย่างเป็นการเปลี่ยน array เดิมจากตัวอย่างที่แล้วที่มี 3 มิติให้กลายเป็น 1 มิติ

Unknown Dimension

NumPy อนุญาตให้เราเว้นค่าใน parameter ของ attribute ได้ 1 ค่า โดยระบบจะคำนวณให้เองว่าค่านั้นต้องเป็นจำนวนเท่าไหร่ โดยให้ใส่ -1 ไว้ใน parameter นั้น

ตัวอย่างเช่น เรามี array หนึ่งอัน เป็น array แบบ 1 มิติ มีสมาชิกทั้งหมด 12 ตัว ต้องการจัด array ให้อยู่ในรูปของ 3 มิติ โดยต้องการแบ่งข้อมูลออกเป็น 3 กลุ่ม (12/3 ลงตัว แปลว่าจัดกลุ่มได้) และแต่ละกลุ่มให้แบ่งออกเป็น 2 แถว เราสามารถใส่ค่าใน parameter ได้ตามตัวอย่างข้างล่างนี้

c = np.arange(1,13).reshape(3,2,-1)

ตัวอย่างผลลัพธ์ที่ได้

ระบบคำนวณให้เอง และจัดให้ว่าแต่ละแถวมีสมาชิกได้ 2 ตัว

ndarray.base

การเป็นเจ้าของข้อมูลคือ ข้อมูลนั้นถูกใช้สำหรับ array นี้อันเดียวเท่านั้น การเปลี่ยนแปลงข้อมูลหรือสมาชิกของข้อมูลใน array นี้จะไม่มีผลต่อ array อื่น และการเปลี่ยนแปลงข้อมูลใน array อื่นจะไม่มีผลต่อ array นี้

สามารถตรวจสอบได้โดยใช้ attribute ndarray.base จะได้คำตอบเป็น boolean

เช่น

สร้าง array ชื่อ c เป็น 1 มิติด้วยฟังชั่น arange() จากตั้งตัวแปร d ให้มีค่าเท่าเป็น array c ที่ใช้ attribute reshape() เปลี่ยนมิติเป็น 3 มิติ

เมื่อใช้คำสั่ง

d.base is None

คือการถามระบบว่า d เป็น base หรือไม่ คือไม่ได้คัดลอก d มาจาก array ไหน คำตอบคือ False เพราะ array d มาจาก array c

d.base is c

ต่อมาเป็นการถามระบบว่า base ของ d คือ c ใช่หรือไม่ คำตอบคือ True

เมื่อมีการคัดลอก array จะมีการคัดลอก 2 แบบ คือแบบ shallow copy และ deep copy

Advertisement