gpt4 book ai didi

python - NumPy 中的高效 3x3 和 2x2 行列式

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:11 27 4
gpt4 key购买 nike

我有一个大的 numpy 数组 arr,形状为 (N, D, M, D) 其中 D 是两个或三。该数组可以被认为是 (D,D) 矩阵 block ,这些矩阵在 NM 维度中被阻塞在一起。我想取这些 (D,D) 矩阵中每一个的行列式:

out = np.empty((N,M))
for i in xrange(N):
for j in xrange(M):
out[i,j] = np.linalg.det(arr[i,:,j,:])

唯一的问题是 np.linalg.det 不对小矩阵进行特殊处理,因此对每个 block 进行完整的 BLAS 调用和 LU 分解。事实上,对于一个 2 x 2 矩阵 np.linalg.det 在我最近的 Core i7 系统上需要大约 40us。我有哪些改进此片段性能的选择?

最佳答案

为了澄清 duffymo 的观点,您可以使用向量化的 numpy 操作轻松利用您自己的函数的 block 结构。这是否会给您带来加速可能取决于 M 和 N 的大小:

>>> a = numpy.arange(2 * 2 * 2 * 2).reshape(2, 2, 2, 2)
>>> a[:,0,:,0] * a[:,1,:,1] - a[:,1,:,0] * a[:,0,:,1]
array([[-4, -4],
[-4, -4]])
>>> a = numpy.arange(2 * 3 * 2 * 3).reshape(2, 3, 2, 3)
>>> a[:,0,:,0] * a[:,1,:,1] * a[:,2,:,2] + \
a[:,0,:,1] * a[:,1,:,2] * a[:,2,:,0] + \
a[:,0,:,2] * a[:,1,:,0] * a[:,2,:,1] - \
a[:,0,:,0] * a[:,1,:,2] * a[:,2,:,1] - \
a[:,0,:,1] * a[:,1,:,0] * a[:,2,:,2] - \
a[:,0,:,2] * a[:,1,:,1] * a[:,2,:,0]
array([[0, 0],
[0, 0]])

关于python - NumPy 中的高效 3x3 和 2x2 行列式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13068011/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com