import numpy as np
### 不补全卷积运算
""" 实现 5*5的w矩阵 与 核为3*3的矩阵ker卷积 得到3*3的矩阵的过程
一共生成3*3的计算矩阵 (5-3+1)*(5-3+1)= 3*3 = 9个
每个3*3 的矩阵一共9个元素,最终形成9*9的矩阵来存储要计算的矩阵
"""
"""
k_r : 卷积核的长
k_1 : 卷积核的宽
w_r : 原始矩阵的长
w_l : 原始矩阵的宽
"""
## 得到要计算的矩阵
def pro_M(k_r,k_1,w_r,w_l):
temp = []
for n in range(k_r):
for i in range(n,n+k_r):
for m in range(k_1):
for j in range(m,m+k_1):
if(i>=0 and i<= w_r and j>=0 and j<= w_l):
temp.append(w[i][j])
# print('temp:', temp)
# print(type(temp))
# print(np.shape(temp))
w_int = np.array(temp).reshape((9,9))
# print(w_int)
return w_int
## 卷积计算
def conv(w_int,ker):
L = []
w2 = np.zeros([3,3])
for i in range(3):
n = 3
for j in range(n):
w2 = w_int[i*3:(i+1)*3, j*3:(j+1)*3]
# print(w2)
L.append(np.sum(w2 * ker))
pot = np.array(L)
pot = pot.reshape((3, 3))
# print(L)
# print(type(L))
# pot = np.array(L)
# print(type(pot))
# print(pot.reshape((3,3)))
return pot
if __name__ == '__main__':
w = np.round(np.random.random([5, 5])) # 原始矩阵
ker = np.ones([3, 3]) # 卷积的核函数
pot = np.zeros([5, 5]) # 得到的目标矩阵
w_int = np.zeros([9, 9]) # 存储计算的矩阵
k_row = ker.shape[0] # 取出行
k_col = ker.shape[1] # 取出列
w_row = w.shape[0] # 取出行
w_col = w.shape[1] # 取出行
w_i = pro_M(k_row,k_col,w_row, w_col)
pot = conv(w_i, ker)
print(pot)
其中一种结果
[[7. 6. 6.]
[6. 5. 5.]
[6. 6. 4.]]