我有一个方阵 A (可以是任何大小),我想获取上三角部分并将这些值放入一个数组中,而没有中心对角线下方的值 (k=0)。
A = sympy.Matrix([[ 4, 0, 3],
[ 2, 4, -2],
[-2, -3, 7]])
使用 A_upper = numpy.triu (A) 让我
A_Upper = sympy.Matrix([[ 4, 0, 3],
[ 0, 4, -2],
[ 0, 0, 7]])
但是从这里我如何仅将上三角元素复制到一个简单的数组中?例如:
[4, 0, 3, 4, -2, 7]
我打算只是迭代并复制所有非零元素,但是上三角中的零是允许的。
可以使用 numpy 的
triu_indices
获取上三角形矩阵的索引,然后使用这些索引来展平矩阵并获取所需的数组。
import sympy
import numpy as np
A = sympy.Matrix([[4, 0, 3],
[2, 4, -2],
[-2, -3, 7]])
# 获取上三角矩阵的索引
indices = np.triu_indices(A.shape[0], k=1) # k=1 排除对角线
# 使用索引从展平的矩阵中获取元素
A_upper_triangular = np.array(A)[indices].tolist()
print(A_upper_triangular)
这会打印出:
[0, 3, 4, -2, 7]
以下是代码的工作原理:
-
np.triu_indices(A.shape[0], k=1)
返回两个数组,分别包含上三角形矩阵(不包括对角线,因为k=1
)的行索引和列索引。 -
np.array(A)[indices]
使用这些索引来选择原始矩阵A
中的对应元素。这将返回一个包含所需元素的 1D numpy 数组。 -
.tolist()
将 numpy 数组转换为 Python 列表。
这个方法有效利用了 numpy 的索引功能,从而避免了任何显式的循环,因此更有效率。
标签:python,numpy,sympy From: 20647643