บทความนี้สาธิตวิธีแปลงเมทริกซ์ 3 มิติ (List of List of List) เป็นรายการพิกัด (Coordinate List) โดยใช้ zip() และ List Comprehension
โค้ดตัวอย่าง
# 3D Matrix: 3 ชั้น x 2 แถว x 2 คอลัมน์
my_list_1 = [
[['He', 'Wi'], ['llo', 'll']],
[['Pyt', 'i'], ['hon', 'sFun']],
[['Ho', 'g'], ['pe', 'ood']]
]
print("3D Matrix ต้นฉบับ:")
for i, layer in enumerate(my_list_1):
print(f" Layer {i}: {layer}")
# เรียงลำดับ (ตัวเลือก)
my_list_1.sort()
print("\nหลังเรียง:")
for i, layer in enumerate(my_list_1):
print(f" Layer {i}: {layer}")
# แปลงเป็น Coordinate List
# zip(sub_elem_1, sub_elem_2) จับคู่คอลัมน์ในแต่ละแถว
my_result = [
ele
for sub_elem_1, sub_elem_2 in my_list_1
for ele in zip(sub_elem_1, sub_elem_2)
]
print("\nผลลัพธ์ (Coordinate List):")
print(my_result)
ผลลัพธ์
3D Matrix ต้นฉบับ:
Layer 0: [['He', 'Wi'], ['llo', 'll']]
Layer 1: [['Pyt', 'i'], ['hon', 'sFun']]
Layer 2: [['Ho', 'g'], ['pe', 'ood']]
หลังเรียง:
Layer 0: [['He', 'Wi'], ['llo', 'll']]
Layer 1: [['Ho', 'g'], ['pe', 'ood']]
Layer 2: [['Pyt', 'i'], ['hon', 'sFun']]
ผลลัพธ์ (Coordinate List):
[('He', 'llo'), ('Wi', 'll'), ('Ho', 'pe'), ('g', 'ood'), ('Pyt', 'hon'), ('i', 'sFun')]
อธิบาย Logic
# สำหรับแต่ละ Layer (sub_elem_1, sub_elem_2 คือ 2 แถวใน Layer นั้น)
for sub_elem_1, sub_elem_2 in my_list_1:
# zip จับคู่คอลัมน์: (col0_row0, col0_row1), (col1_row0, col1_row1)
for ele in zip(sub_elem_1, sub_elem_2):
# ele คือ Tuple ของค่าที่อยู่ตำแหน่งเดียวกันใน 2 แถว
yield ele
การประยุกต์ใช้
- Image Processing: Pixel coordinates (x, y, channel)
- 3D Geometry: Vertex coordinates
- Tensor Operations: Reshape 3D → 2D Coordinates
- Game Development: Voxel to Coordinate mapping
การขยาย: เก็บพิกัด (z, y, x) ด้วย
coords = []
for z, layer in enumerate(my_list_1):
for y, (row1, row2) in enumerate(zip(layer[0], layer[1])):
for x, (val1, val2) in enumerate(zip(row1, row2)):
coords.append((z, y, x, val1, val2))
# ผลลัพธ์: (layer, row, col, val_from_row1, val_from_row2)