Điển hình là các hàm sau: numpy.linalg.matrix_power, … • Một số hàm khác của thư viện Numpy: numpy.dot, numpy.zeros, numpy.random.randint, np.vectorize, …- Sử dụng một số hàm trong thư v
PHƯƠNG PHÁP GIẢI QUYẾT BÀI TOÁN
Khởi tạo ma trận
- Tạo các các trận với các phần tử là các số nguyên ngẫu nhiên:
• Ma trận A: kích thước: 10x10, các phần tử nguyên ngẫu nhiên thuộc đoạn từ 1 đến 100
• Ma trận B: kích thước: 2x10, các phần tử nguyên ngẫu nhiên thuộc đoạn từ 1 đến 20
• Ma trận C: kích thước: 10x2, các phần tử nguyên ngẫu nhiên thuộc đoạn từ 1 đến 20
- Trong phần lập trình, chỉ được sử dụng các thư viện numpy, sympy, math, matplotlib
1.1.2 Phương pháp khởi tạo ma trận
Để khởi tạo ma trận, chúng ta có thể sử dụng sự kết hợp của hai hàm reshape và randint, cả hai đều thuộc thư viện Numpy.
Cú pháp để thay đổi kích thước mảng trong Python là np.reshape(, (, )) Ví dụ, ta có thể biến mảng A có kích thước 1x100 thành ma trận 2 chiều Tuy nhiên, cần lưu ý rằng trong lý thuyết Đại Số Tuyến Tính, mảng 2 chiều và ma trận có những khác biệt nhất định, đặc biệt là trong phép nhân ma trận.
• Công dụng: Được sử dụng để thay đổi kích thước của mảng mà không làm thay đổi dữ liệu của nó
- Hàm randint: là hàm có sẵn trong module random của thư viện Numpy
• Cú pháp: np.random.randint( , , size 5
, dtype = ), nếu không có “dtype” thì mặc định sẽ là kiểu “int”
Hàm randint được sử dụng để tạo ra mảng các số nguyên ngẫu nhiên, cho phép người dùng khởi tạo một ma trận với kiểu dữ liệu và số phần tử tùy ý Để chuyển đổi mảng đã khởi tạo thành ma trận với kích thước yêu cầu, hàm reshape sẽ được áp dụng.
Phương pháp giải quyết các bài toán
1.2.2 Bài toán “Lưu các số nguyên lẻ trong ma trận A vào một véc tơ mới, in véc tơ kết quả ra màn hình.”
1.2.1.1 Vấn đề của bài toán
- Xác định số nào là số lẻ có trong ma trận
- Thêm các số lẻ đó vào trong một vecto mới
- In kết quả vecto ra màn hình
- Cách 1: Sử dụng mảng boolean để tìm các giá trị chẵn trong ma trận A.
Cụ thể, ta sử dụng cú pháp sau: “array = A[A%2 == 0]” Trong đó:
Câu lệnh “A%2 == 0” sẽ tạo ra một mảng boolean có kích thước tương đương với mảng A, trong đó mỗi phần tử tại hàng i và cột j sẽ trả về “True” nếu số đó chia hết cho 2, và “False” nếu không.
• Sau đó A[A%2 == 0] sẽ trả về mảng một chiều mà tại đó, có giá trị
“True” như đã nói ở trên
• Ví dụ: Ta có ma trận A = [ [1, 2],
[4, 3] ] Thì biểu thức “A%2 == 0” sẽ trả về mảng boolean như sau:
Từ đó “A[A%2 == 0]” sẽ lấy các phần tử mà tại đó, mảng boolen trả về
Ưu điểm của phương pháp này là tiết kiệm thời gian lập trình, giảm độ dài mã nguồn và tăng tốc độ xử lý, đặc biệt hiệu quả với các trường hợp ma trận có kích thước nhỏ.
Nhược điểm của đoạn code trên là không thể tác động đến một phần tử cụ thể trong mảng Hơn nữa, nếu mảng có kích thước quá lớn, việc tạo ra một mảng boolean mới sẽ tiêu tốn nhiều bộ nhớ, dẫn đến giảm tốc độ thực thi của code.
Để duyệt qua từng phần tử của ma trận (mảng 2 chiều), bạn có thể sử dụng 2 vòng lặp for Trong quá trình này, hãy kiểm tra các điều kiện cần thiết và thêm những phần tử thỏa mãn vào một mảng mới Phương pháp này giúp bạn dễ dàng quản lý và xử lý dữ liệu trong ma trận một cách hiệu quả.
Hàm len() được sử dụng để xác định số lượng phần tử trong mảng một chiều, trong khi hàm range cho phép tạo ra một dãy số từ 1 đến vị trí chỉ định, không bao gồm len(A) và len(A[i]).
Ưu điểm của phương pháp này là cho phép lấy giá trị của phần tử tại vị trí nhất định một cách dễ dàng Tốc độ chạy của mã phụ thuộc vào kích thước của mảng, điều này mang lại lợi ích khi làm việc với các mảng lớn, vì việc duyệt qua từng phần tử sẽ tiết kiệm bộ nhớ hơn so với cách khác.
Nhược điểm: So với cách 1, cách này sẽ tốn thời gian hơn so với một mảng có kích thước nhỏ
Kết luận cho ma trận kích thước 10x10 cho thấy rằng cách 1 nhanh hơn đáng kể Do đó, đối với bài toán này và các bài toán xử lý mảng nhỏ, cách 1 là lựa chọn tối ưu Ngược lại, cách 2 nên được áp dụng cho các bài toán xử lý mảng lớn.
1.2.2 Bài toán “Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in véc tơ kết quả ra màn hình ”
1.2.2.1 Vấn đề của bài toán
- Tìm được các số nguyên tố trong ma trận A
…Số nguyên tố là số chỉ chia hết cho 1 và chính nó…
- Thêm các số lẻ đó vào trong một vecto mới
- In kết quả vecto ra màn hình
Để kiểm tra xem các số trong mảng có phải là số nguyên tố hay không, bạn có thể duyệt qua từng phần tử và sử dụng hàm isprime có sẵn trong thư viện sympy.
Hàm append() được sử dụng để thêm phần tử vào mảng Nếu hàm isprime trả về giá trị "True", phần tử số nguyên tố sẽ được thêm vào mảng.
Cách này giúp người mới bắt đầu dễ dàng duyệt qua từng phần tử trong mảng, tạo điều kiện thuận lợi cho việc tiếp cận các kiến thức cơ bản trong lập trình.
- Cách 2: Sử dụng hàm numpy.vectorize:
Hàm numpy.vectorize trong thư viện NumPy cho phép biến đổi một hàm đơn giản thành một hàm có khả năng xử lý từng phần tử của mảng Hàm này trả về một hàm vectorized được thiết kế để làm việc với các phần tử của mảng một cách hiệu quả.
Đầu tiên, định nghĩa hàm checkPrime(num) với đầu vào là số nguyên num, trả về “-1” nếu đầu vào không phải là số nguyên tố, ngược lại, trả về “num” Hàm này sẽ kiểm tra từ số 2 đến nửa giá trị của số nguyên “num” Tiếp theo, sử dụng np.vectorize(checkPrime) để tạo một hàm mới (temp) áp dụng lên từng phần tử của mảng, và gọi temp1 = temp(A) để tạo một ma trận có kích thước giống như ma trận A, trong đó mỗi phần tử được kiểm tra tính nguyên tố.
A sẽ được áp dụng hàm checkPrime() Cuối cùng thêm cách giá trị khác
“-1” trong “temp1” bằng phép so sánh “temp1[temp1 != 1]” và lưu kết - quả vào vecto “ex_e” In kết quả ra màn hình bằng câu lệnh “print”
• Hàm numpy.vectorize được cung cấp chủ yếu cho tính tiện lợi, không phải hiệu suất Hiện thực của nó về cơ bản là một vòng lặp
- Kết luận: Hàm numpy.vectorize cũng tương tự như vòng lặp vậy, để dễ tiếp cận hơn với mảng chiều, ta nên sử dụng cách 1
1.2.3 Bài toán “Cho ma trận D = CB, đảo ngược các phần tử trong các hàng lẻ của ma trận D và in ma trận kết quả ra màn hình.”
1.2.3.1 Vấn đề của bài toán
- Lấy được các phần tử trong các hàng lẻ của ma trận D
- Đảo ngược các phần tử trong ma trận vừa lấy được
- Gán giá trị bằng ma trận vừa được đảo ngược vào trong ma trận D.
Để nhân hai ma trận, chúng ta có nhiều phương pháp, nhưng để đơn giản hóa, có thể sử dụng A@B hoặc np.dot(A, B), trong đó A và B là hai ma trận có thể nhân được Việc nhân hai ma trận cũng tương đương với việc tính tích vô hướng của hai mảng Cần lưu ý rằng dấu “*” trong Python được sử dụng để nhân từng phần tử của hai mảng, do đó không phù hợp cho việc nhân ma trận.
Để trích xuất các phần tử từ các hàng lẻ của ma trận D, chúng ta áp dụng phương pháp slice với cú pháp “D[1::2]” Cách sử dụng này cho phép tạo ra một ma trận mới, trong đó chỉ bao gồm các hàng có chỉ số lẻ từ ma trận D.
- Sử dụng hàm “np.flip(D, axis = 1)” để đảo ngược các phần tử trong từng hàng của ma trận
• axis là các trục được xác định cho các mảng có nhiều hơn một chiều Mảng
2 chiều có hai trục tương ứng: trục thứ nhất chạy dọc xuống dưới qua các hàng (axis 0) và trục thứ hai chạy ngang qua các cột (axis 1)
- Sau khi có được một ma trận đảo ngược các phần tử của các hàng lẻ của ma trận, ta tiếp hành gán nó vào lại trong ma trận D
1.2.4 Bài toán “Đối với ma trận A, hãy tìm các hàng có số nguyên tố nhiều nhất và in các hàng đó ra màn hình.”
1.2.4.1 Vấn đề của bài toán
- Tìm các hàng có số nguyên tổ
- Xác định hàng có số nguyên tố nhiều nhất?
- In các hàng đó ra màn hình
- Tạo 2 mảng, 1 mảng để lưu các biến đếm số nguyên tố của mỗi hàng, 1 mảng để lưu các hàng có số nguyên tố nhiều nhất
Để duyệt qua từng phần tử của mảng, sử dụng hai vòng lặp for kết hợp với hàm isprime từ thư viện sympy Nếu phần tử tại vị trí (i, j) là số nguyên tố, biến đếm sẽ tăng lên Sau khi hoàn thành hàng i, giá trị của biến đếm sẽ được thêm vào mảng đếm và biến đếm sẽ được reset về 0.
- Sử dụng hàm max() để tìm giá trị lớn nhất có trong mảng và gán nó cho biến nào đó để đi so sánh
HÌNH ẢNH MÃ NGUỒN VÀ ĐẦU RA
Phần khởi tạo ma trận
Hình 1 – Khởi tạo ma trận
Phần mô tả hàm isprime() trong thư viện sympy
Hình 3 – mô tả hàm isprime() 2.3 Phần “tính biểu thức 𝐀 𝐓 + 𝑨 + 𝑪𝑩 + 𝑩 𝑻 𝑪 𝑻 và in kết quả ra màn hình”
Hình 5 – Kết quả code câu a
2.4 Phần “tính biểu thức 𝟏𝟎 𝐀 + ( 𝟏𝟏 𝑨 ) 𝟐 + ( 𝟏𝟐 𝑨 ) 𝟑 + ⋯ + ( 𝑨 𝟏𝟕 ) 𝟖 + ( 𝟏𝟖 𝑨 ) 𝟗 + ( 𝟏𝟗 𝑨 ) 𝟏𝟎 và in kết quả ra màn hình”
Hình 7 - Kết quả code câu b
2.5 Phần “Lưu các hàng lẻ của ma trận A thành một ma trận mới và in ma trận kết quả ra màn hình.”
Hình 9 - Kết quả code câu c 2.6 Phần “Lưu các số nguyên lẻ trong ma trận A vào một véc tơ mới, in véc tơ kết quả ra màn hình.”
Hình 13 - Kết quả code câu d cách 2
Hình 11 – Kết quả code câu d cách 1
2.7 Phần “Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in véc tơ tổng ra màn hình.”
Hình 15 - Kết quả code câu e cách 1
Kết quả từ việc thực hiện code câu e theo cách 2 cho ma trận D = CB, trong đó các phần tử ở các hàng lẻ của ma trận D được đảo ngược và hiển thị trên màn hình.
Hình 19 – Kết quả code câu f 2.9 Phần “Đối với ma trận A, hãy tìm các hàng có số nguyên tố nhiều nhất và in các hàng đó ra màn hình.”
Đối với ma trận A, nhiệm vụ là tìm các hàng có dãy số lẻ liền kề dài nhất và in những hàng này ra màn hình Hình 21 minh họa kết quả của đoạn mã thực hiện yêu cầu này.
Hình 23 – Kết quả code câu h
Phần “Lưu các hàng lẻ của ma trận A thành một ma trận mới và in ma trận kết quả ra màn hình.”
Phần “Lưu các số nguyên lẻ trong ma trận A vào một véc tơ mới, in véc tơ kết quả ra màn hình.”
tơ kết quả ra màn hình.”
Hình 13 - Kết quả code câu d cách 2
Hình 11 – Kết quả code câu d cách 1
Phần “Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in véc tơ tổng ra màn hình.”
tơ tổng ra màn hình.”
Hình 15 - Kết quả code câu e cách 1
Phần “Cho ma trận D = CB, đảo ngược các phần tử trong các hàng lẻ của ma trận D và in ma trận kết quả ra màn hình”
Phần “Đối với ma trận A, hãy tìm các hàng có số nguyên tố nhiều nhất và in các hàng đó ra màn hình.”
và in các hàng đó ra màn hình.”
Phần “Đối với ma trận A, hãy tìm các hàng có dãy số lẻ liền kề dài nhất và
và in các hàng đó ra màn hình.”
Hình 23 – Kết quả code câu h