2017-11-13 10 views
1

私はこのようになりますsparse.txtがあります。必要なdense.txtはこれです(numpyの/ scipyのダウンロードが、NO sklearn)efficentlyスパース行列から密行列を作成していない

# first column is label 0 or 1 
# rest of the data is sparse data 
# maximum value in the data is 4, so the future dense matrix will 
# have 1+4 = 5 elements in a row 
# file: sparse.txt 
1 1:1 2:1 3:1 
0 1:1 4:1 
1 2:1 3:1 4:1 

を:

# required file: dense.txt 
1 1 1 1 0 
0 1 0 0 1 
1 0 1 1 1 

scipyのダウンロードcoo_matrixを使用しなければ、このような単純な方法でそれをやった:

def create_dense(fsparse, fdense,fvocab): 
    # number of lines in vocab 
    lvocab = sum(1 for line in open(fvocab)) 

    # create dense file 
    with open(fsparse) as fi, open(fdense,'w') as fo: 
     for i, line in enumerate(fi): 
      words = line.strip('\n').split(':') 
      words = " ".join(words).split() 

      label = int(words[0]) 
      indices = [int(w) for (i,w) in enumerate(words) if int(i)%2] 

      row = [0]* (lvocab+1) 
      row[0] = label 

      # use listcomps 
      row = [ 1 if i in indices else row[i] for i in range(len(row))] 

      l = " ".join(map(str,row)) + "\n" 
      fo.write(l) 

      print('Writing dense matrix line: ', i+1) 

質問 最初に高密度マトリックスを作成せずにNUMPY/Scipyを使用することなく、スパースデータからラベルとデータを直接取得する方法はありますか?

質問: numpy.fromregexを使用してスパースデータを読み取るにはどうすればよいですか?

私の試みは、次のとおりです。

def read_file(fsparse): 
    regex = r'([0-1]\s)([0-9]):(1\s)*([0-9]:1)' + r'\s*\n' 
    data = np.fromregex(fsparse,regex,dtype=str) 

    print(data,file=open('dense.txt','w')) 

それは動作しませんでした!

関連リンク:

Parsing colon separated sparse data with pandas and numpy(明示的sklearnを禁止する前に回答)

+0

リストで '行 'を収集するのはどうですか?それはリスト(数字のリスト)でしょうか?あなたはそれから直接配列を作ることができますか? – hpaulj

+0

@hpaulj、私はラベルの配列を作ることができますが、行列を作るのが難しいです。 – astro123

+0

@hpauj、私もnumpy.loadtxt、 – astro123

答えて

3

ではなく、ファイルを経由して、直接、密な配列を作成するようにコードを微調整:あなたはスキップする場合

fsparse = 'stack47266965.txt' 

def create_dense(fsparse, fdense, lvocab):  
    alist = [] 
    with open(fsparse) as fi: 
     for i, line in enumerate(fi): 
      words = line.strip('\n').split(':') 
      words = " ".join(words).split() 

      label = int(words[0]) 
      indices = [int(w) for (i,w) in enumerate(words) if int(i)%2] 

      row = [0]* (lvocab+1) 
      row[0] = label 

      # use listcomps 
      row = [ 1 if i in indices else row[i] for i in range(len(row))] 
      alist.append(row) 
    return alist 

alist = create_dense(fsparse, fdense, 4) 
print(alist) 
import numpy as np 
arr = np.array(alist) 
from scipy import sparse 
M = sparse.coo_matrix(arr) 
print(M) 
print(M.A) 

0926:~/mypy$ python3 stack47266965.py 
[[1, 1, 1, 1, 0], [0, 1, 0, 0, 1], [1, 0, 1, 1, 1]] 
    (0, 0) 1 
    (0, 1) 1 
    (0, 2) 1 
    (0, 3) 1 
    (1, 1) 1 
    (1, 4) 1 
    (2, 0) 1 
    (2, 2) 1 
    (2, 3) 1 
    (2, 4) 1 
[[1 1 1 1 0] 
[0 1 0 0 1] 
[1 0 1 1 1]] 

を生成密集したarrは、あなたがM.colM.rowと同等のものを生成する必要がある、とM.data属性(順序は関係ありません)

[0 0 0 0 1 1 2 2 2 2] 
[0 1 2 3 1 4 0 2 3 4] 
[1 1 1 1 1 1 1 1 1 1] 

私はそれを修正しようとはしませんので、私はregexあまり使用しないでください。私はあなたが

['1' '1' '2' '2' '1' '3' '1'] 

'1 1:1 2:1 3:1' 

を変換するとします。しかし、それはちょうどwords/labelステージにあなたを取得します。


スパースへの直接:

def create_sparse(fsparse, lvocab): 

    row, col, data = [],[],[] 
    with open(fsparse) as fi: 
     for i, line in enumerate(fi): 
      words = line.strip('\n').split(':') 
      words = " ".join(words).split() 

      label = int(words[0]) 
      row.append(i); col.append(0); data.append(label) 

      indices = [int(w) for (i,w) in enumerate(words) if int(i)%2] 
      for j in indices: # quick-n-dirty version 
       row.append(i); col.append(j); data.append(1) 
    return row, col, data 

r,c,d = create_sparse(fsparse, 4) 
print(r,c,d) 
M = sparse.coo_matrix((d,(r,c))) 
print(M) 
print(M.A) 

[0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2] [0, 1, 2, 3, 0, 1, 4, 0, 2, 3, 4] [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1] 
.... 

を生産違う唯一のものは、値0 sparseと1つのdata項目がそのの世話をしますです。

+0

すごい!!それはまさに私が探していたものです。 – astro123

3

これは基本的にsvmlight/libsvm formatです。

scikit-learn'sload_svmlight_fileまたはより効率的なsvmlight-loaderを使用してください。ここに車輪を再発明する必要はありません!

from sklearn.datasets import load_svmlight_file 

X, y = load_svmlight_file('C:/TEMP/sparse.txt') 
print(X) 
print(y) 
print(X.todense()) 

出力:

(0, 0)  1.0 
(0, 1)  1.0 
(0, 2)  1.0 
(1, 0)  1.0 
(1, 3)  1.0 
(2, 1)  1.0 
(2, 2)  1.0 
(2, 3)  1.0 
[ 1. 0. 1.] 
[[ 1. 1. 1. 0.] 
[ 1. 0. 0. 1.] 
[ 0. 1. 1. 1.]] 
+0

ありがとう、私は本当に感謝しますnumpy/scipyとsciki-learnなしで。私はnumpy/scipyでそれを行う方法を学びたいと思っています。解決は問題ではありません、私は上記のようにdense.txtを非効率的に見つける方法を見つけました。 – astro123

+0

[コードを読んで使用する](https://github.com/scikit-learn/scikit-learn/blob/f3320a6f/sklearn/datasets/svmlight_format.py)。それのどこが悪いんだい?より速い外部のものも分解しやすくなります(oops;恐らくcythonベース...)。だからあなたはこれが学習経験であり、現実世界の使用ではないと言っていますか? – sascha

+0

私はsascha博士と混乱して申し訳ありませんが、この質問ではnumpy/scipyを使用してこの作業を行う方法を学んでおり、sklearnはあまりにも先進的であり、ブラックボックスから外しています。 – astro123

関連する問題