gpt4 book ai didi

python - 不使用 for 循环构建对角矩阵

转载 作者:行者123 更新时间:2023-11-28 22:50:28 25 4
gpt4 key购买 nike

我正在尝试在不使用 for 循环的情况下在 Python 中构建以下矩阵:

A 
[[ 0.1 0.2 0. 0. 0. ]
[ 1. 2. 3. 0. 0. ]
[ 0. 1. 2. 3. 0. ]
[ 0. 0. 1. 2. 3. ]
[ 0. 0. 0. 4. 5. ]]

我在 NumPy 中尝试了 fill_diagonal 方法(见下面的矩阵 B),但它没有给我矩阵 A 中显示的相同矩阵:

B 
[[ 1. 0.2 0. 0. 0. ]
[ 0. 2. 0. 0. 0. ]
[ 0. 0. 3. 0. 0. ]
[ 0. 0. 0. 1. 0. ]
[ 0. 0. 0. 4. 5. ]]

这是我用来构造矩阵的 Python 代码:

import numpy as np
import scipy.linalg as sp # maybe use scipy to build diagonal matrix?

#---- build diagonal square array using "for" loop
m = 5

A = np.zeros((m, m))

A[0, 0] = 0.1
A[0, 1] = 0.2

for i in range(1, m-1):
A[i, i-1] = 1 # m-1
A[i, i] = 2 # m
A[i, i+1] = 3 # m+1

A[m-1, m-2] = 4
A[m-1, m-1] = 5

print('A \n', A)

#---- build diagonal square array without loop
B = np.zeros((m, m))

B[0, 0] = 0.1
B[0, 1] = 0.2

np.fill_diagonal(B, [1, 2, 3])

B[m-1, m-2] = 4
B[m-1, m-1] = 5

print('B \n', B)

那么有没有一种方法可以在不使用 for 循环的情况下构造像矩阵 A 所示的对角矩阵?

最佳答案

scipy.sparse 中有这方面的函数,例如:

from scipy.sparse import diags

C = diags([1,2,3], [-1,0,1], shape=(5,5), dtype=float)

C = C.toarray()

C[0, 0] = 0.1
C[0, 1] = 0.2
C[-1, -2] = 4
C[-1, -1] = 5

对角矩阵通常非常稀疏,因此您也可以将其保留为稀疏矩阵。这甚至可以带来巨大的效率优势,具体取决于应用。


稀疏矩阵的效率增益很大程度上取决于矩阵大小。对于 5x5 阵列,我猜你真的不会被打扰。但是对于较大的矩阵,使用稀疏矩阵创建数组可能要快得多,下面的示例使用单位矩阵来说明:

%timeit np.eye(3000)
# 100 loops, best of 3: 3.12 ms per loop

%timeit sparse.eye(3000)
# 10000 loops, best of 3: 79.5 µs per loop

但是当您需要对稀疏数组进行数学运算时,稀疏矩阵数据类型的真正优势就会显示出来:

%timeit np.eye(3000).dot(np.eye(3000))
# 1 loops, best of 3: 2.8 s per loop

%timeit sparse.eye(3000).dot(sparse.eye(3000))
# 1000 loops, best of 3: 1.11 ms per loop

或者当您需要处理一些非常大但稀疏的数组时:

np.eye(1E6)
# ValueError: array is too big.

sparse.eye(1E6)
# <1000000x1000000 sparse matrix of type '<type 'numpy.float64'>'
# with 1000000 stored elements (1 diagonals) in DIAgonal format>

关于python - 不使用 for 循环构建对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597353/

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