arr.reshape ใน NumPy ผมใช้สำหรับเปลี่ยนรูปร่าง (shape) ของ array โดยจำนวนสมาชิกทั้งหมดยังคงเดิม เช่น แปลง 1D array 12 ตัวให้กลายเป็น matrix 3×4 ได้ทันที โดยไม่ต้องสร้างข้อมูลใหม่ครับ
arr.reshape(newshape)
arr.reshape(newshape)
ndarray
คืนเป็น ndarray รูปร่างใหม่ตามที่ระบุครับ ส่วนใหญ่เป็น view ของ array เดิม (ไม่ใช่ copy) ทำให้เร็วมาก เอาไปคำนวณ vectorized ต่อได้ทันที หรือ chain ต่อกับฟังก์ชัน numpy อื่นได้เลย
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| newshape | int | tuple of int | Yes | รูปร่างใหม่ที่ต้องการ ใส่เป็น tuple เช่น (3, 4) หรือตัวเลขเดียว เช่น 12 สำหรับ 1D — ใส่ -1 ในมิติที่ต้องการให้คำนวณอัตโนมัติได้ | |
| order | str | Optional | 'C' | ลำดับการอ่านสมาชิก ‘C’ คือ row-major (ค่า default), ‘F’ คือ column-major (Fortran-style), ‘A’ คือ auto ตาม memory layout |
arr.reshape(2, 3)arr.reshape(2, 3)
[[1 2 3]
[4 5 6]]
arr.reshape(3, -1)arr.reshape(3, -1)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
np.arange(12).reshape(3, 4)np.arange(12).reshape(3, 4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
matrix.reshape(-1)matrix.reshape(-1)
[1 2 3 4 5 6]
NumPy จะ raise ValueError ทันทีครับ เช่น array 12 ตัว reshape เป็น (3,5) จะได้ error ว่า ‘cannot reshape array of size 12 into shape (3,5)’ เพราะ 3×5=15 ≠ 12 — ผมเลยแนะนำให้ใช้ -1 ในมิติที่ไม่แน่ใจ จะปลอดภัยกว่าคำนวณเองครับ
ต่างกันมากครับ reshape ต้องการจำนวนสมาชิกเท่าเดิมเสมอ ถ้าไม่ตรงจะ error ส่วน np.resize ยืดหยุ่นกว่า — ถ้า shape ใหม่ใหญ่กว่า มันจะ repeat ข้อมูลให้ ถ้าเล็กกว่าก็ตัดทิ้ง ส่วนตัวผมใช้ reshape เกือบตลอดเพราะอยากให้ error ตอนจำนวนไม่ตรง ดีกว่า silent data duplication ครับ
ส่วนใหญ่คืน view ครับ หมายความว่า array ใหม่กับเดิมชี้ไปหน่วยความจำเดียวกัน แก้ค่าใน reshape แล้วตัวเดิมก็เปลี่ยนด้วย ถ้าอยากได้ copy จริงๆ ให้ต่อด้วย .copy() เช่น arr.reshape(3,4).copy() ครับ — NumPy อาจบังคับคืน copy ในบางกรณีที่ memory layout ไม่ compatible แต่ safe กว่าคือ explicit .copy() เสมอ
reshape คือวิธีที่ผมใช้บ่อยที่สุดตอนต้องเตรียม array ให้พร้อมสำหรับการคำนวณหรือส่งเข้า model ครับ 😎
แนวคิดหลักคือ ข้อมูลทุกตัวใน array ถูกเรียงกันต่อเนื่องในหน่วยความจำแบบ row-major (C-order) — ผมคิดว่ามันเหมือนการพับกระดาษ: ตัวเลขยังอยู่ครบ แค่เปลี่ยนว่าจะพับกี่แถว กี่คอลัมน์ กฎข้อเดียวที่ห้ามทำผิดคือ จำนวนสมาชิกรวมต้องเท่ากันก่อนและหลัง เช่น array 12 ตัว → reshape เป็น (3,4), (4,3), (2,6), (12,1) ได้ทั้งนั้น แต่ reshape เป็น (3,5) ไม่ได้เพราะ 3×5=15 ≠ 12
ที่เจ๋งคือ ใส่ -1 ในมิติที่ยังไม่รู้ได้เลย แล้ว NumPy จะคำนวณให้อัตโนมัติ เช่น arr.reshape(3, -1) แปลว่า “ผมต้องการ 3 แถว คำนวณจำนวนคอลัมน์เองเลย” ✨
ส่วนตัวผมใช้ reshape บ่อยมากตอนทำงานกับ machine learning — เช่น แปลงภาพ 784 pixels ให้เป็น (28,28) หรือแปลง batch ของข้อมูลให้ตรง shape ที่ model ต้องการ ถ้าคุ้นกับ Excel การที่ข้อมูล 1 แถวยาวๆ กลายเป็นตาราง grid ก็คือแนวคิดเดียวกันครับ