从numpy.triu()只将sympy Matrix的上三角值复制到数组中?

时间:2013-12-18 00:43:51

标签: python numpy sympy

我有一个方形矩阵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]

我打算迭代并复制所有非零元素,但允许上三角形为零。

2 个答案:

答案 0 :(得分:2)

给出一个numpy数组,使用numpy.triu_indices(N, k=0)这是一个简单的操作,其中N是方形数组的大小:

In [28]: B = np.array([[4, 0, 3], [2, 4, -2], [-2, -3, 7]])

In [29]: B[np.triu_indices(B.shape[0])]
Out[29]: array([ 4,  0,  3,  4, -2,  7])

B.shape[0]就在那里,以防你不想硬编码数组的大小(3)。


鉴于一个同情的矩阵,这并不容易,但足够接近。只需转换为numpy数组,并确保从dtype更改object。如果您的矩阵大小合理,这应该可以正常工作。如果它们变得非常大,你可能想重新考虑一下。

In [36]: A = sp.Matrix([[4, 0, 3], [2, 4, -2], [-2, -3, 7]])

# you can change the dtype of the new array to match the first array
# e.g., .astype(int), .astype(sp.Symbol)
# or you can just leave the default (dtype=object)
In [37]: C = np.array(A) #.astype(new_dtype) 

In [38]: C[np.triu_indices(C.shape[0])]
Out[38]: array([ 4,  0,  3,  4, -2,  7])

要将它们放入普通列表中,请执行

In [39]: C[np.triu_indices(C.shape[0])].tolist()
Out[39]: [4, 0, 3, 4, -2, 7]

答案 1 :(得分:0)

您可以执行以下操作:

>>> A = Matrix([
[ 4,  0,  3],
[ 2,  4, -2],
[-2, -3,  7]])
>>> flatten([A[i,i:] for i in range(A.rows)])
[4, 0, 3, 4, -2, 7]