Trong mảng Numpy, chúng ta có thể sử dụng kỹ thuật Array Reshaping để biến đổi kích thước của một mảng từ 1 chiều thành hai chiều, hoặc từ 2 chiều thành 1 chiều….Trong từng bài toán khác nhau mà ta sẽ cần biến đổi kích thước mảng sao cho phù hợp với các phép tính toán.

1. Shape của mảng Numpy

Mảng NumPy có một thuộc tính được gọi là shape được sử dụng để trả về kích thước của mảng đó. Ví dụ khai báo một mảng 2 chiều (ma trận) có kích thước 2 x 4 trong Numpy và lấy kích thước bằng thuộc tính shape như sau:

import numpy as np

# Khai bao mang 2 chieu kich thuoc 2 x 4
a = np.array([
    [1, 2, 3, 4], 
    [5, 6, 7, 8]
])

# Kich thuoc mang
print(a.shape)

Kết quả:

(2, 4)

Trong khi tạo mảng, chúng ta cũng có thể chỉ định số chiều cho một mảng Numpy thông qua thuộc tính ndim. Lưu ý rằng số chiều khác nhau thì các shape của mảng cũng sẽ khác nhau. Ví dụ ndim = 1 sẽ có shape = 1 x n, ndim = 2 sẽ có shape = m x n, ndim = 3 sẽ có shape = d x m x n 

import numpy as np

# Tao mang a co so chieu bang 3
a = np.array([
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 0, 1, 2]
], ndmin=3)

# Hien thi mang a
print(a)

# Kich thuoc mang a
print("Kich thuoc mang {0}".format(a.shape))

Kết quả:

[[[1 2 3 4]
  [5 6 7 8]
  [9 0 1 2]]]
Kich thuoc mang (1, 3, 4)

2. Reshape mảng Numpy

Reshape có nghĩa là định dạng lại kích thước cho một mảng để phù hợp với các tính toán hoặc xử lý mảng trong Numpy. Chúng ta có thể định dạng mảng 1 chiều  có kích thước 1 x N thành mảng 2 chiều có kích thước m x n hay định dạng mảng 1 chiều  có kích thước 1 x N thành mảng 3 chiều có kích thước d x m x n thông qua hàm np.reshape() có sẵn trong Numpy.

Ví dụ dưới đây, khai báo mảng 1 chiều có kích thước 1 x 12 định dạng lại thành mảng 2 chiều có kích thước 4 x 3 bằng hàm np.reshape() như sau:

import numpy as np

# Mang 1 chieu co kich thuoc 1 x 12
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Mang a ban dau")
print(a)

# Thay doi mang 1 chieu kich thuoc tu 1 x 12 sang mang 2 chieu kich thuoc 3 x 4
a = a.reshape(4, 3)
print("Mang a sau khi reshape")
print(a)

Kết quả:

Mang a ban dau
[ 1  2  3  4  5  6  7  8  9 10 11 12]
Mang a sau khi reshape
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

Ví dụ tiếp theo, khai báo mảng 1 chiều có kích thước 1 x 12 định dạng lại thành mảng 3 chiều có kích thước 2 x 3 x 2 bằng hàm np.reshape() như sau:

import numpy as np

# Mang 1 chieu co kich thuoc 1 x 12
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Mang a ban dau")
print(a)

# Thay doi mang 1 chieu kich thuoc tu 1 x 12 sang mang 3 chieu kich thuoc 2 x 3 x 2
a = a.reshape(2, 3, 2)
print("Mang a sau khi reshape")
print(a)

Kết quả:

Mang a ban dau
[ 1  2  3  4  5  6  7  8  9 10 11 12]
Mang a sau khi reshape
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]]

Lưu ý: Số lượng phần tử có trong mảng 1 chiều phải bằng với kích thước m x n của mảng 2 chiều hoặc d x m x n đối với mảng 3 chiều.

3. Làm phẳng mảng Numpy

Ở trong các ví dụ trên, chúng ta đã thực hiện được việc định dạng hay còn hiểu là biết đổi kích thước từ mảng 1 chiều có kích thước 1 x N sang các mảng 2 chiều kích thước m x n hoặc 3 chiều kích thước d x m x n.

Trong một số trường hợp, ta cần thực hiện biến đổi ngược lại từ các mảng 2 chiều hoặc 3 chiều về kích thước của mảng 1 chiều. Việc thực hiện biến đổi này sẽ được gọi là làm phẳng mảng khi đó các mảng được biến đổi sẽ trở về mảng 1 chiều có kích thước 1 x N. Để làm phẳng mảng 2 chiều hoặc 3 chiều về mảng 1 chiều, khi đó ta cần sử dụng hàm np.reshape() với tham số là -1.

Ví dụ làm phẳng mảng hai chiều về mảng 1 chiều bằng hàm np.reshape(-1) như sau:

import numpy as np

# Mang 2 chieu co kich thuoc 4 x 3
a = np.array([
    [1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9], 
    [10, 11, 12]
])
print("Mang a ban dau")
print(a)

# Thay doi mang 2 chieu 4 x 3 thanh mang 1 chieu 1 x 12
a = a.reshape(-1)
print("Mang a sau khi reshape")
print(a)

Kết quả:

Mang a ban dau
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
Mang a sau khi reshape
[ 1  2  3  4  5  6  7  8  9 10 11 12]

Ví dụ tiếp theo, làm phẳng mảng 3 chiều về mảng 1 chiều bằng hàm np.reshape(-1) như sau:

import numpy as np

# Mang 3 chieu co kich thuoc 2 x 3 x 2
a = np.array([
    [[1, 2], 
     [3, 4],
     [5, 6]], 
    
    [[7, 8], 
     [9, 10],
     [11,12]]
])
print("Mang a ban dau")
print(a)

# Thay doi mang 3 chieu 2 x 3 x 2 thanh mang 1 chieu 1 x 12
a = a.reshape(-1)
print("Mang a sau khi reshape")
print(a)

Kết quả:

Mang a ban dau
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]]
Mang a sau khi reshape
[ 1  2  3  4  5  6  7  8  9 10 11 12]