вопрос индексации ndarray - PullRequest
1 голос
/ 24 июня 2010

например, есть матрица:

import numpy as np
A = np.array([[ 8. , -6. , 2. ], 
              [-0.5, 8. , -6. ], 
              [ 0.5, -0.5, 2. ]])

Это результат разложения LU (разложения Дулитла). (A = [L \ U])
Я хочу получить L и U от A.
U должно быть:

U = np.array([[ 8., -6., 2.], 
              [ 0., 8., -6.], 
              [ 0., 0.,  2.]])

L должно быть:

L = np.array([[ 1. , 0. , 0. ], 
              [-0.5, 1. , 0. ], 
              [ 0.5, -0.5, 1.]])

тогда, я хочу знать, как получить L и U от A?

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Вам не нужно никаких манипуляций с индексами.Просто используйте функции tril, triu и identity:

import numpy as np
A = np.array([[ 8. , -6. , 2. ], 
              [-0.5, 8. , -6. ], 
              [ 0.5, -0.5, 2. ]])

U = np.triu(A)

#[[ 8. -6.  2.]
# [-0.  8. -6.]
# [ 0. -0.  2.]]

L = np.tril(A, k=-1) + np.identity(3)

#[[ 1.   0.   0. ]
# [-0.5  1.   0. ]
# [ 0.5 -0.5  1. ]]
1 голос
/ 30 июня 2010

То, что ты хочешь, не похоже на LU-разложение для меня, http://en.wikipedia.org/wiki/LU_decomposition

>>> U_ = np.array([[ 8., -6., 2.],
              [ 0., 8., -6.],
              [ 0., 0.,  2.]])
>>> L_ = np.array([[ 1. , 0. , 0. ],
              [-0.5, 1. , 0. ],
              [ 0.5, -0.5, 1.]])
>>> np.dot(L_, U_)
array([[  8.,  -6.,   2.],
       [ -4.,  11.,  -7.],
       [  4.,  -7.,   6.]])

LU разложение доступно в scipy.linalg

>>> A = np.array([[ 8. , -6. , 2. ], [-0.5, 8. , -6. ], [ 0.5, -0.5, 2. ]])
>>> import scipy.linalg as spla
>>> P, L, U = spla.lu(A)
>>> L
array([[ 1.        ,  0.        ,  0.        ],
       [-0.0625    ,  1.        ,  0.        ],
       [ 0.0625    , -0.01639344,  1.        ]])
>>> U
array([[ 8.        , -6.        ,  2.        ],
       [ 0.        ,  7.625     , -5.875     ],
       [ 0.        ,  0.        ,  1.77868852]])
>>> np.dot(L, U)
array([[ 8. , -6. ,  2. ],
       [-0.5,  8. , -6. ],
       [ 0.5, -0.5,  2. ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...