2016-03-30 4 views
0

Я пытаюсь сделать что-то очень простое, но смущен обилием информации о разреженных матрицах и векторах в Python.Как использовать разреженные векторы и матрицы в Python?

Я хочу создать два вектора x и y, один из длины 5 и один из длины 6, являющийся разреженным. Затем я хочу установить одну координату в каждом из них. Затем я хочу создать матрицу A, разреженную, которая равна 5 x 6, и добавить к ней внешний продукт между x и y. Затем я хочу сделать SVD на этом A.

Вот что я пробовал, и он пойдет не так во многих отношениях.

from scipy import sparse; 
import numpy as np; 
import scipy.sparse.linalg as ssl; 

x = sparse.bsr_matrix(np.zeros(5)); 
x[1] = 1; 
y = sparse.bsr_matrix(np.zeros(6)); 
y[1] = 2; 
A = sparse.coo_matrix(5, 6); 

A = A + np.outer(x,y.transpose()) 

svdresult = ssl.svds(A,1); 
+0

сделал работу решение? – Ilja

ответ

0

Сначала вы должны определить данные, которые хотите сохранить в разреженной матрице, прежде чем конструировать его. В противном случае вы должны использовать вместо этого sparse.csc_matrix или sparse.csr_matrix. Затем вы можете назначить или изменить данные, как это:

x[0, 1] = 1

Во-вторых, внешнее произведение векторов х и у равносильна x.transpose() * y.


Вот рабочий код:

from scipy import sparse 
import numpy as np 
import scipy.sparse.linalg as ssl 

x = np.zeros(5) 
x[1] = 1 
x_bsr = sparse.bsr_matrix(x) 
y = np.zeros(6) 
y[1] = 2 
y_bsr = sparse.bsr_matrix(y) 

A = sparse.coo_matrix((5, 6)) # Sparse matrix 5 x 6 
B = x_bsr.transpose().dot(y_bsr) # Outer product of x and y 

svdresult = ssl.svds((A + B), 1) 

Выход:

(array([[ 5.55111512e-17], 
     [ -1.00000000e+00], 
     [ 0.00000000e+00], 
     [ -2.77555756e-17], 
     [ 1.11022302e-16]]), array([ 2.]), array([[ 0., -1., 0., 0., 0., 0.]])) 
Смежные вопросы