2017-08-28 64 views
0

我試圖創建一個cython函數,它遍歷兩個numpy字符串數組,並根據其中的數據創建一個新的dicts列表。在循環中創建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。它也不喜歡使用字典來聲明空映射。

回答

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