2017-08-28 36 views
0

私はcython関数を作成しようとしています。これは2つのnumpy配列の文字列を繰り返し処理し、そこにあるデータから新しいdictsリストを作成します。cythonのループでC++マップを作成する

私はcythonからC++を使い、これらのnumpy配列を繰り返して、私が行ったようにマップのベクトルを構築すると思っていました。私は各反復で空のマップを作成する方法を理解できないようです。

私はこのような何かをしたいと思います:

def extract_data(words_seq, labels_seq, max_sentence_len): 
    cdef int i 
    cdef vector[map[string, vector[string]]] data 
    cdef vector[string] new_entry 

    data = [] 

    for i in range(len(words_seq)): 
     cdef map[string, vector[string]] new_row_map = {} 
     labels = labels_seq[i] 
     words = words_seq[i] 

     for j in range(max_sentence_len): 
      label = labels_seq[i][j] 
      word = words_seq[i][j] 

      if label == 'junk': 
       continue 
      elif new_row_map.count(label) == 0: 
       new_entry = [word] 
       new_row_map[label] = new_entry 
      else: 
       new_row_map[label].push_back(word) 
     data.push_back(new_row_map) 

    return data 

しかし、私はエラーcdef statement not allowed hereを取得します。また、私は空のマップを宣言するためにdictリテラルを使用して私を好きではありません。

答えて

1

cdef

+0

どのようにすれば、各繰り返しで新しいマップを作成できますか?ループの外側で 'new_entry'を宣言すると、各繰り返しで同じマップに新しいエントリが追加されてしまいます。 – Luke

0

は、私はほとんどそれを右に持っていたが判明、私はループの外を意味する関数スコープレベル
で使用されなければなりません。マップのコピーは、マップへのポインタではなく、各繰り返しでベクターに追加されます。したがって、ループの外側にマップを宣言して、各繰り返しでマップをクリアすると、動作するように見えます。

def extract_data(words_seq, labels_seq, max_sentence_len): 
    cdef int i, j 
    cdef vector[map[string, vector[string]]] data 
    cdef vector[string] new_entry 
    cdef map[string, vector[string]] new_row_map 
    cdef str label, word 

    data = [] 

    for i in range(len(words_seq)): 

     for j in range(max_sentence_len): 
      label = labels_seq[i][j] 
      word = words_seq[i][j] 

      if label == 'junk': 
       continue 
      elif new_row_map.count(label) == 0: 
       new_entry = [word] 
       new_row_map[label] = new_entry 
      else: 
       new_row_map[label].push_back(word) 
     data.push_back(new_row_map) 
     new_row_map.clear() 

    return data 
関連する問題