2016-11-20 1 views
3

현재 numpy 배열에 문자열을 파싱하는 데 문제가 있습니다.파이썬 : 배열에 문자열 파싱

캐릭터는 다음과 같다 :

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 항목의 길이를 가지며, I는 밀도의 문자열을 다시 분석 할 필요 형식은 형식 : 내가 필요로하는 동안은 문자열로 NumPy와 배열을 분석하기 위해 관리하는 동안

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

, 내가 잘못 브래킷을 갖는 문제로 실행 (즉, 기능을 array2string의 빌드는, [] 사용 { })

나는 도움이되는 제안을 열어이 문제를 효율적으로 해결합니다 (대형 스파 스 벡터의 경우에도 마찬가지 임).

감사합니다.

\ 편집 : 주어진 벡터} {첫 번째에서 두 번째 숫자, 즉 항상 1이 될 것입니다, 항상 하나의 차원 (그리고 당신은 단지 요소의 위치를 ​​찾을 수 1 개 인덱스가 필요합니다) 여기에

+0

항상 1 차원입니까? – fuglede

답변

2

이입니다 numpythonic 방법 : 나는 Kasramvd의 접근 방식 @ 좋아하지만, 나뿐만 아니라 거기이 1 점을 추가하는 듯 거라고 생각

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])