python - numpy:如何计算雅可比矩阵
问题描述
我做了一个两个矩阵的点积的例子,我想计算这个点积的雅可比矩阵。第一个矩阵的形状为 4x3,第二个矩阵的形状为 2x4。生成的雅可比矩阵应该具有 (4x3x2x3) 的形状,因为我是在第一个矩阵中计算它。
因此,假设雅可比矩阵的每个元素都是 DiDjAkAl,该元素将表示 i,j 输出与 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)
所以基本上我的问题是如何找到那个点积的雅可比。
解决方案
从您的解决方案开始,我们可以看到 Indexesi
和k
始终是相同的值,因此可以删除 for 循环。然后可以使用列表作为切片一次性分配第一个 for 循环。具体来说:
def vect_jacobian(A,b):
dotProduct = A.dot(b)
ans = np.zeros((A.shape[0], A.shape[1], dotProduct.shape[0], dotProduct.shape[1]))
L = list(range(A.shape[0]))
ans[L,:,L,:] = b
return ans
r = vect_jacobian(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)
推荐阅读
- android - 当用户捕获手机中任何程序的屏幕截图时,即使我的应用程序处于终止模式,也会调用颤振或原生 android 应用程序的功能
- laravel - 我想托管我的网站管理面板以由子域提供服务
- package - AEM filter.xml 条目的默认模式是什么?
- oop - 何时使用预定义的类范围访问类型与匿名访问类范围类型作为参数?
- android - 每 10 毫秒(或更长)从多个设备接收传感器数据
- android - 如何使用 kotlin 在 Android Studio 中使用 Storage Access Storage 创建 pdf?
- javascript - Next.js React 传单地图未正确显示
- php - MySQL“不在”与 COUNT() 无法正常工作
- azure-functions - Azure Function 在“压力测试”中抛出 SimpleInjector.ActivationException
- html - 在 raspberry pi 上托管的网站上显示一个文件夹的链接