2016-04-14 36 views
1

Bir csr_matrix 'a' sparse matrix türüm var. Yeni bir csr_matrix 'b' oluşturmak için bir işlem yapmak istiyorum. Burada her 'b' satırı 'a' satırı ile aynıdır.karo operasyonu csr_matrix'in bir satırından csr_matrix oluşturmak için

Normal numpy dizileri için 'tile' işlemi kullanmak mümkündür. Ama aynı şeyi csr_matrix için bulamıyorum. matrisin boyutu olduğu gibi ilk önce bir numpy matris yapma ve csr_matrix dönüştürmek

bir seçenek değildir 10000 x 10000

cevap

0

diğer bir listeden yeni seyrek matris oluşturmanıza olanak sağlayan bir blk biçimi vardır matrisler.

Yani bir başlangıç ​​için size

a1 = a[I,:] 
ll = [a1,a1,a1,a1] 
sparse.blk_matrix(ll) 

Bunu test etmek için çalışan bir kabuk yok olabilir.

Bu biçim dahili olarak tüm giriş dizilerini coo biçimine dönüştürür ve coo özniteliklerini 3 büyük listelere (veya diziye) toplar. Döşenmiş satırlar durumunda, data ve col (j) değerleri sadece tekrar eder. row (I) değerleri adım attı.

Yaklaşmanın başka bir yolu, küçük bir test matrisi oluşturmak ve özniteliklere bakmak olacaktır. Ne tür tekrarlar görüyorsun? Desenleri coo biçiminde görmek çok kolaydır. lil da çoğaltmak için belki de *n işlemiyle kolayca yapılabilir. csr anlaması daha zor.

+0

belleğin bir sürü alacak ll yaratarak değil mi. Seyrek matrisin amacını ortadan kaldırmaz mıydı? – Naman

+0

Ayrıca sanırım çözüme ulaşabildim, bu yüzden cevap olarak ekledim. Ilgilenirseniz bir göz atın lütfen. – Naman

+1

'csr'yi doğrudan oluşturmak biraz daha kompakt olacaktır, çünkü 'indptr' özniteliği eşdeğeri' coo'un satırlarından daha kısadır. – hpaulj

0

Tam olarak numpy matrisini oluşturmayı gerektirmeyen ve amacım için oldukça hızlı olan bir cevap verebilirim. Bu yüzden gelecekte insanlar için yararlı olup olmadığını cevap olarak eklemeden: Bu 'a' 2. satır alır ve 'b' oluşturmak için çinileri

rows, cols = a.shape 
b = scipy.sparse.csr_matrix((np.tile(a[2].data, rows), np.tile(a[2].indices, rows), 
          np.arange(0, rows*a[2].nnz + 1, a[2].nnz)), shape=a.shape) 

.

zamanlama testi aşağıdadır, 10000x10000 matris için oldukça hızlı görünüyor:

100 loops, best of 3: 2.24 ms per loop 
+1

"Verileriniz" ve "indeksler" leriniz bir "coo" için önerdiğim şeydir, ancak "indptr" iniz, "coo" nun gerektirdiği süreden daha kısadır. 'Coo' satır eşdeğeri np.arange (...) gibi bir şeyi kullanır. Yineleme (nnz) ',' [0,0.0,1,1 ... 2,2 ...] ' . – hpaulj

+0

Doğru, çözümünüzü daha önce yanlış anladım. – Naman