Python numpy:如何计算雅可比矩阵

Python numpy:如何计算雅可比矩阵,python,numpy,math,matrix,Python,Numpy,Math,Matrix,我做了一个两个矩阵的点积的例子,我想计算这个点积的雅可比矩阵。第一个矩阵的形状为4x3,第二个矩阵的形状为2x4。得到的雅可比矩阵的形状应该是(4x3x2x3),因为我是用第一个矩阵来计算它的 假设雅可比矩阵的每个元素都是DiDjAkAl,这个元素表示i,j输出w.r.t,k,l输入的偏导数。下面是代码中的示例: import numpy as np A = np.array([[1,2,3,4], [5,6,7,8], [9,10,11

我做了一个两个矩阵的点积的例子,我想计算这个点积的雅可比矩阵。第一个矩阵的形状为4x3,第二个矩阵的形状为2x4。得到的雅可比矩阵的形状应该是(4x3x2x3),因为我是用第一个矩阵来计算它的

假设雅可比矩阵的每个元素都是DiDjAkAl,这个元素表示i,j输出w.r.t,k,l输入的偏导数。下面是代码中的示例:

import numpy as np

A = np.array([[1,2,3,4],
              [5,6,7,8],
              [9,10,11,12]])
#shape = (4x3)

b = np.array([[1,2],
              [3,4],
              [5,6],
              [7,8]])
#shape = (2x4)

dotProduct = A.dot(b)
#shape = (2x3)

基本上我的问题是如何找到点积的雅可比矩阵

我快速回答了我要查找的内容,但它用于循环。任何能帮我矢量化这个函数的人都会给我很大的帮助

def jacobian(A, b):
    dotProduct = A.dot(b)
    ans = np.zeros((A.shape[0], A.shape[1], dotProduct.shape[0], dotProduct.shape[1]))
    for l in range(A.shape[0]):
        i = 0
        for k in range(A.shape[1]):
            ans[l][k][l][:] = b[i][:]
            i = i + 1
    return ans

我快速回答了我要查找的内容,但它用于循环。任何能帮我矢量化这个函数的人都会给我很大的帮助

def jacobian(A, b):
    dotProduct = A.dot(b)
    ans = np.zeros((A.shape[0], A.shape[1], dotProduct.shape[0], dotProduct.shape[1]))
    for l in range(A.shape[0]):
        i = 0
        for k in range(A.shape[1]):
            ans[l][k][l][:] = b[i][:]
            i = i + 1
    return ans

从您的解决方案开始,我们可以看到索引
i
k
总是相同的值,因此可以删除for循环。然后,第一个for循环可以使用一个列表作为切片,一次性分配所有。具体地说:

定义向量雅可比矩阵(A,b): 点积=A.dot(b) ans=np.0((A.shape[0],A.shape[1],dotProduct.shape[0],dotProduct.shape[1])) L=列表(范围(A.shape[0])) ans[L,:,L,:]=b 返回ans r=向量雅可比(A,b) 在我的本地机器中使用
%timeit
,我们可以看到,即使使用这些小尺寸矩阵,时间也有3倍的改进:

%timeit jacobian(A,b)
29.6 µs ± 3.74 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit vect_jacobian(A,b)
10.4 µs ± 589 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

从您的解决方案开始,我们可以看到索引
i
k
总是相同的值,因此可以删除for循环。然后,第一个for循环可以使用一个列表作为切片,一次性分配所有。具体地说:

定义向量雅可比矩阵(A,b): 点积=A.dot(b) ans=np.0((A.shape[0],A.shape[1],dotProduct.shape[0],dotProduct.shape[1])) L=列表(范围(A.shape[0])) ans[L,:,L,:]=b 返回ans r=向量雅可比(A,b) 在我的本地机器中使用
%timeit
,我们可以看到,即使使用这些小尺寸矩阵,时间也有3倍的改进:

%timeit jacobian(A,b)
29.6 µs ± 3.74 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit vect_jacobian(A,b)
10.4 µs ± 589 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

@我想你可以从和开始。请考虑接受这里的回答,JAMESB,我想你可以从。请考虑接受这里的答案