piton

2016-04-03 22 views
0

bir seyrek matriksin dan (sadece sıfır olmayan değerler ve indeksleri kaydederek) bir sözlük formatına alın ben seyrek matris aşağıdaki gibi bir şey hayal vardır:piton

X=([1.5 0.0 0.0 71.9 0.0 0.0 0.0], 
    [0.0 10.0 0.0 2.0 0.0 0.0 0.0], 
    [0.0 0.0 0.0 0.0 0.0 0.0 11.0]) 

herhangi bir özel yöntem yoktur zaten vardı ki

Örnek

: kendi endeksleri X satırların karşılık gelen her satır, sadece sıfırdan farklı değerler ve tutan aşağıdaki dosya formatı (veya matris), bu tür bir matris dönüştürmek
X1=(0:1.5 3:71.9 
    1:10 3:2 
    6:11) 

sorum, python'da seyrek bir matrisin dışında bu tür bir sözlük üretebilen herhangi bir var mıdır?

+0

Lütfen, pos Senin teşebbüsün mü? –

+3

Bu soruyu off-topic olarak kapatmak için oy kullanıyorum çünkü OP bu problemi çözmek için hiçbir çaba göstermedi. –

+0

İkinci satırın hepsi sıfırsa ne olur? Çıktınızın nasıl biçimlendirilmesini bekliyorsunuz? – Alexander

cevap

1

Bir scipy.sparse.csr_matrix kullanabilirsiniz. Onun indptr, indices ve data özelliklerinde Aradığınız verileri içerir: Eğer satır ve sütun bir matris olduğundan

import scipy.sparse as sparse 
X = sparse.csr_matrix([[1.5, 0.0, 0.0, 71.9, 0.0, 0.0, 0.0], 
         [0.0, 10.0, 0.0, 2.0, 0.0, 0.0, 0.0], 
         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.0]]) 
for row in range(X.shape[0]): 
    sl = slice(X.indptr[row], X.indptr[row+1]) 
    pairs = zip(X.indices[sl], X.data[sl]) 
    print(' '.join(['{}:{}'.format(idx, val) for idx, val in pairs])) 

0:1.5 3:71.9 
1:10.0 3:2.0 
6:11.0 
+0

tekrar teşekkürler geçerli biçimini bu sözlüğü depolamak için en iyi yolu nedir :) benim veri kümesi gibi davaları yok mu? çünkü daha sonra bu sözlüğe benzer uzunlukta başka bir liste (hedef etiketler) birleştirmem gerekiyor! – Far

+0

Lütfen tüm detaylarla yeni bir soru başlatın. Burada kafa karıştırıcı olan bir çok şey var. Örneğin, [dictionary] (https://docs.python.org/2/library/stdtypes.html#dict) sizin için nedir? ve nasıl [a listeye] ile bitiştirmek isteyen yok (https://docs.python.org/2/library/functions.html#list)? Bunu nasıl yapmak istediğinizi yapmalısınız. "0: 1.5 3: 71.9" dizgisi, sözlüğünün bir "{0: 1.5, 3: 71.9}" sözdiziminden bazılarına sahiptir, ancak eğer bir dict yaparsak, tüm bilgilerini kaybederiz. sıra geldi. – unutbu

+0

Ayrıca, eğer aynı sütunda * veya daha fazla sıfır olmayan girdi * varsa, o zaman hepsi aynı aynı dict anahtarını paylaşacakları için bu girişlerden biri hariç tümüyle ilgili bilgileri kaybedersiniz. Bu nedenle, numaralı telefonu garanti edemiyorsanız, hiçbir sütunun sıfırdan fazla giriş içermediğinden emin olabilirsiniz. Ve eğer iki seyrek matris birleştirmeyi planlıyorsanız, kombine seyrek matrisi için de aynı şeyi garanti edebilecek misiniz? Bu yüzden lütfen yeni bir soru başlatın ve açık bir örnek ve göstererek istenen sonucun ne olması gerektiğini gösterin. – unutbu

1

Bu, orada uzun bir yol almalısınız:

X = np.array(
    [[1.5, 0.0, 0.0, 71.9, 0.0, 0.0, 0.0], 
    [0.0, 10.0, 0.0, 2.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.0]]) 

>>> zip(np.argwhere(X).tolist(), X[X != 0]) 
[([0, 0], 1.5), 
([0, 3], 71.900000000000006), 
([1, 1], 10.0), 
([1, 3], 2.0), 
([2, 6], 11.0)] 

Ayrıca iç içe sözlük anlama kullanabilirsiniz:

>>> {(row, col): val 
    for row, data in enumerate(X) 
    for col, val in enumerate(data) 
    if val != 0} 
{(0, 0): 1.5, 
(0, 3): 71.900000000000006, 
(1, 1): 10.0, 
(1, 3): 2.0, 
(2, 6): 11.0} 
1

verir, benim düşünceme göre, bence sen Daha sonra kolaylık sağlamak için sıfır olmayan değerlerin satırını ve sütunlarını belirtmeniz gerekir; bu, herhangi bir kitaplığı içe aktarmadan yapılabilir:

>>> x 
[[1.5, 0.0, 0.0, 71.9, 0.0, 0.0, 0.0], [0.0, 10.0, 0.0, 2.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.0]] 
>>> 
>>> l = [] 
>>> 
>>> for i,subl in enumerate(x): 
     for j, item in enumerate(subl): 
      if item: 
       l.append(([i,j],item)) 
>>> l 
[([0, 0], 1.5), ([0, 3], 71.9), ([1, 1], 10.0), ([1, 3], 2.0), ([2, 6], 11.0)]