list[:]不起作用

我想要编写一个像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

这个错误可以不解答。

求解。

b空了

img