Python numpy:如何计算雅可比矩阵
我做了一个两个矩阵的点积的例子,我想计算这个点积的雅可比矩阵。第一个矩阵的形状为4x3,第二个矩阵的形状为2x4。得到的雅可比矩阵的形状应该是(4x3x2x3),因为我是用第一个矩阵来计算它的 假设雅可比矩阵的每个元素都是DiDjAkAl,这个元素表示i,j输出w.r.t,k,l输入的偏导数。下面是代码中的示例: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
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,我想你可以从。请考虑接受这里的答案