Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chuyển đổi tuple N×N thành ma trận trong Python

Khi cần chuyển đổi tuple lồng nhau (các tuple con) thành ma trận vuông N×N bằng cách đệm (padding) số 0, có thể dùng vòng lặp và toán tử *.

Toán tử * trên tuple lặp lại nội dung tuple nhiều lần.

Ví dụ

# Tuple lồng nhau: các hàng có độ dài khác nhau
matrix_tuple = ((11, 14), (0, 78), (33, 11), (10, 78))
print("Tuple lồng nhau ban đầu:")
for row in matrix_tuple:
    print(f"  {row} (độ dài: {len(row)})")

N = 4  # Kích thước ma trận vuông mong muốn: 4x4
print(f"\nKích thước ma trận N = {N}")

# Đệm mỗi hàng đến độ dài N bằng số 0
padded_matrix = []
for row in matrix_tuple:
    # (0,) * (N - len(row)) tạo tuple số 0 đủ độ dài
    padding = (0,) * (N - len(row))
    new_row = row + padding
    padded_matrix.append(new_row)

print("\nMa trận sau khi đệm 0 (list of tuples):")
for row in padded_matrix:
    print(f"  {row}")

# Chuyển thành tuple của tuple nếu cần
final_matrix = tuple(padded_matrix)
print(f"\nMa trận cuối cùng (tuple of tuples): {final_matrix}")

Kết quả

Tuple lồng nhau ban đầu:
  (11, 14) (độ dài: 2)
  (0, 78) (độ dài: 2)
  (33, 11) (độ dài: 2)
  (10, 78) (độ dài: 2)

Kích thước ma trận N = 4

Ma trận sau khi đệm 0 (list of tuples):
  (11, 14, 0, 0)
  (0, 78, 0, 0)
  (10, 78, 0, 0)
  (33, 11, 0, 0)

Ma trận cuối cùng (tuple of tuples):
((11, 14, 0, 0), (0, 78, 0, 0), (10, 78, 0, 0), (33, 11, 0, 0))

Giải thích

  • Tuple gốc có 4 hàng, mỗi hàng độ dài 2.
  • Mục tiêu: ma trận 4x4 (N=4).
  • Mỗi hàng cần thêm N - len(row) = 2 số 0.
  • (0,) * 2 tạo tuple (0, 0).
  • Nối row + padding tạo hàng mới độ dài 4.

Cách ngắn gọn: List comprehension

N = 4
padded = tuple(row + (0,) * (N - len(row)) for row in matrix_tuple)
print(padded)

Xử lý trường hợp hàng dài hơn N (cắt bớt)

def to_square_matrix(tuple_of_tuples, N, pad_value=0):
    """Chuyển thành ma trận NxN: đệm nếu ngắn, cắt nếu dài."""
    result = []
    for row in tuple_of_tuples:
        if len(row) >= N:
            result.append(row[:N])  # Cắt bớt
        else:
            result.append(row + (pad_value,) * (N - len(row)))  # Đệm
    return tuple(result)

# Test
data = ((1, 2, 3, 4, 5), (6, 7), (8,))
print(to_square_matrix(data, 4))
# ((1, 2, 3, 4), (6, 7, 0, 0), (8, 0, 0, 0))

Sử dụng NumPy (khuyên dùng cho ma trận lớn)

import numpy as np

matrix_tuple = ((11, 14), (0, 78), (33, 11), (10, 78))
N = 4

# Chuyển thành array, tự động xử lý padding
arr = np.array([list(row) + [0]*(N-len(row)) for row in matrix_tuple])
print(arr)
# [[11 14  0  0]
#  [ 0 78  0  0]
#  [33 11  0  0]
#  [10 78  0  0]]