NumPy中高效的3x3和2x2决定因素

时间:2012-10-25 11:54:54

标签: python numpy linear-algebra

我有一个形状为arr的大型numpy数组(N, D, M, D),其中D为两个或三个。可以将该数组视为(D,D)N维度中阻塞在一起的M矩阵块。我希望采用每个(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不是特殊情况的小矩阵,每个块的完整BLAS调用和LU分解也是如此。实际上,对于2乘2的矩阵np.linalg.det在我最近的Core i7系统上需要大约40us。我有哪些方法可以改善这个片段的性能?

2 个答案:

答案 0 :(得分:3)

为了澄清duffymo的观点,您可以使用矢量化numpy操作轻松利用您自己的函数来利用块结构。这是否给你加速可能取决于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]])

答案 1 :(得分:1)

您不需要LU分解来计算2x2或3x3基质的行列式。公式众所周知。为什么不编写自己的函数并调用它们呢?