gpt4 book ai didi

python - 具有单位矩阵和正则矩阵的高效 Kronecker 积 - NumPy/Python

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:13 33 4
gpt4 key购买 nike

我正在开发一个 python 项目并使用 numpy。我经常需要通过单位矩阵计算矩阵的克罗内克积。这些是我代码中的一个相当大的瓶颈,所以我想优化它们。我必须服用两种产品。第一个是:

np.kron(np.eye(N), A)

这个很容易优化,只需使用 scipy.linalg.block_diag .该产品相当于:

la.block_diag(*[A]*N)

大约快 10 倍。但是,我不确定如何优化第二种产品:

np.kron(A, np.eye(N))

我可以使用类似的技巧吗?

最佳答案

一种方法是初始化 4D 的输出数组,然后从 A 向其赋值。这样的分配会广播值,这就是我们在 NumPy 中提高效率的地方。

因此,解决方案是这样的-

# Get shape of A
m,n = A.shape

# Initialize output array as 4D
out = np.zeros((m,N,n,N))

# Get range array for indexing into the second and fourth axes
r = np.arange(N)

# Index into the second and fourth axes and selecting all elements along
# the rest to assign values from A. The values are broadcasted.
out[:,r,:,r] = A

# Finally reshape back to 2D
out.shape = (m*N,n*N)

作为一个函数-

def kron_A_N(A, N):  # Simulates np.kron(A, np.eye(N))
m,n = A.shape
out = np.zeros((m,N,n,N),dtype=A.dtype)
r = np.arange(N)
out[:,r,:,r] = A
out.shape = (m*N,n*N)
return out

要模拟 np.kron(np.eye(N), A),只需交换第一轴和第二轴的操作,第三轴和第四轴也类似 -

def kron_N_A(A, N):  # Simulates np.kron(np.eye(N), A)
m,n = A.shape
out = np.zeros((N,m,N,n),dtype=A.dtype)
r = np.arange(N)
out[r,:,r,:] = A
out.shape = (m*N,n*N)
return out

时间 -

In [174]: N = 100
...: A = np.random.rand(100,100)
...:

In [175]: np.allclose(np.kron(A, np.eye(N)), kron_A_N(A,N))
Out[175]: True

In [176]: %timeit np.kron(A, np.eye(N))
1 loops, best of 3: 458 ms per loop

In [177]: %timeit kron_A_N(A, N)
10 loops, best of 3: 58.4 ms per loop

In [178]: 458/58.4
Out[178]: 7.842465753424658

关于python - 具有单位矩阵和正则矩阵的高效 Kronecker 积 - NumPy/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44461658/

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