我想要编写一个像np.dot()一样的函数
代码:
dot.py
import numpy as np
def dot(a1=[], a2=[]):
list = np.zeros([len(a1), len(a2[0])])
array_a = a1
array_b = a2[:]
l_times = 0
n_times = 0
for l in list:
for n in l:
list[l_times][n_times] = \
array_a[0][0]*array_b[0][0]+array_a[0][1]*array_b[1][0]
del array_b[0][0]
del array_b[1][0]
n_times += 1
array_b = a2[:]
del array_a[0]
l_times += 1
list = list.tolist()
return list
print(dot([[1, 2], [3, 4]], [[1, 3], [2, 4]]))
代码报错了
报错内容:
Traceback (most recent call last):
File "dot.py", line 30, in <module>
print(dot([[1, 2], [3, 4]], [[1, 3], [2, 4]]))
File "dot.py", line 18, in dot
array_a[0][0]*array_b[0][0]+array_a[0][1]*array_b[1][0]
IndexError: list index out of range
我发现列表array_b做修改时列表a2也做了修改,但是不会解决这个问题。
后来,我又发现函数只能用于第一个矩阵有两列,第二个矩阵有两行的两个矩阵。
修改后的代码:
import numpy as np
def dot(a1=[], a2=[]):
#获取第二个矩阵的行数(第一个矩阵的列数也行)
lines = len(a2)
#创建一个值全部为0的列表
list = np.zeros([len(a1), len(a2[0])])
array_a = a1
array_b = a2[:]
#循环的次数
l_times = 0
n_times = 0
#循环
for l in list:
for n in l:
for line in range(lines):
list[l_times][n_times] += array_a[0][line]*array_b[line][0]
#删除第二个矩阵中的第一列
del array_b[0][0]
del array_b[1][0]
n_times += 1
array_b = a2[:]
#把第一个矩阵的第一行删掉
del array_a[0]
l_times += 1
return list
print(dot([[1, 2], [3, 4]], [[1, 3], [2, 4]]))
又报出了另一个错误:
Traceback (most recent call last):
File "C:/Users/Ying/Desktop/Python/算法/dot.py", line 34, in <module>
print(dot([[1, 2], [3, 4]], [[1, 3], [2, 4]]))
File "C:/Users/Ying/Desktop/Python/算法/dot.py", line 21, in dot
list[l_times][n_times] += array_a[0][line]*array_b[line][0]
IndexError: index 2 is out of bounds for axis 0 with size 2
这个错误可以不解答。
求解。