2016-11-20 21 views
3

現在、numpy配列に文字列を解析する際に問題が発生しています。Python:配列を文字列にパースする

文字列は次のようになり:

input = '{{13,1},{2,1},{4,4},{1,7},{9,1}}' 

ストリングは、ベクター自体は、中括弧で区切られ疎ベクトルを表します。中括弧で区切られた各エントリは、どのインデックスにどのエントリがあるかを示します。リストの最初のエントリは、ベクトルの次元をエンコードします。上記の例で

、ベクターは、配列にそれを解析した後0

output = np.array([0,7,1,0,4,0,0,0,0,1,0,0,0]) 

異なる13と4つのエントリの長さを有し、私は、その緻密で文字列にバックアップするために解析しなければなりませんフォーマットは、フォーマットを:私は必要としながら、私は文字列にnumpyの配列を解析するために管理しながら

stringoutput = '{0,7,1,0,4,0,0,0,0,1,0,0,0}' 

が、私は間違ったブラケットを持っていることの問題に遭遇した(すなわち、機能をarray2stringでのビルドは、[]使用しています{ })

私は助けとなるこの提案を開いて、効率的にこれを解決します(大規模なスパースベクトルの場合でも)。

ありがとうございます。

\編集:ここで最初の{}は常に1である(そしてだけの要素の位置を突き止めるために1つのインデックスが必要)であろう

+0

いつも1次元ですか? – fuglede

答えて

2

内の第二の数がA、すなわち、所与のベクトルは、常に一次元ですnumpythonic方法:私はKasramvdのアプローチ@好きですが、私もそこにこれを入れたい考え出し

In [132]: inp = '{{13,1},{2,1},{4,4},{1,7},{9,1}}' 

# Relace the brackets with parenthesis in order to convert the string to a valid python object. 
In [133]: inp = ast.literal_eval(inp.replace('{', '(').replace('}', ')')) 
# Unpack the dimention and rest of then values from input object 
In [134]: dim, *rest = inp 
# Creat the zero array based on extracted dimention 
In [135]: arr = np.zeros(dim) 
# use `zip` to collecte teh indices and values separately in order to be use in `np.put` 
In [136]: indices, values = zip(*rest) 

In [137]: np.put(arr, indices, values) 

In [138]: arr 
Out[138]: 
array([[ 0.], 
     [ 7.], 
     [ 1.], 
     [ 0.], 
     [ 4.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 1.], 
     [ 0.], 
     [ 0.], 
     [ 0.]]) 
1

は:

In [116]: r = (list(map(int, a.split(','))) for a in input[2:-2].split('},{')) 

In [118]: l = np.zeros(next(r)[0], np.int) 

In [119]: for a in r: 
    ...:  l[a[0]] = a[1] 
    ...:  

In [122]: s = '{' + ','.join(map(str, l)) + '}' 

In [123]: s 
Out[123]: '{0,7,1,0,4,0,0,0,0,1,0,0,0}' 
1

これはKasramvdの答え@に基づいています。私は、他の値の入力方法を調整しました。一次元での私の調整

a = np.zeros(dim, dtype=int) 
r = np.array(rest) 
a[r[:, 0], 0] = r[:, 1] 

a 

array([[0], 
     [7], 
     [1], 
     [0], 
     [4], 
     [0], 
     [0], 
     [0], 
     [0], 
     [1], 
     [0], 
     [0], 
     [0]]) 

import numpy as np 
import ast 

inp = '{{13,1},{2,1},{4,4},{1,7},{9,1}}' 
inp = ast.literal_eval(inp.replace('{', '(').replace('}', ')')) 
dim, *rest = inp 

@Kasramvdから

a = np.zeros(dim[0], dtype=int) 
r = np.array(rest) 
a[r[:, 0]] = r[:, 1] 

a 

array([0, 7, 1, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0])