在 cython 的循环中创建 c++ 映射

Posted

技术标签:

【中文标题】在 cython 的循环中创建 c++ 映射【英文标题】:Creating c++ maps in a loop in cython 【发布时间】:2017-08-28 23:17:19 【问题描述】:

我正在尝试创建一个 cython 函数,该函数迭代两个 numpy 字符串数组,并根据其中找到的数据创建一个新的字典列表。

我想我会使用来自 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 必须在函数范围级别使用 我的意思是在循环之外

【讨论】:

我该如何做到这一点并在每次迭代中创建一个新地图?如果我在循环外声明new_entry,我最终只会在每次迭代中附加同一个映射,其中包含新条目。【参考方案2】:

事实证明我几乎是对的。地图的副本在每次迭代时附加到向量,而不是简单地指向地图的指针。因此,如果您在循环之外声明地图,然后在每次迭代时清除它,它似乎可以工作。

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

【讨论】:

以上是关于在 cython 的循环中创建 c++ 映射的主要内容,如果未能解决你的问题,请参考以下文章

Cython 创建 C 函数别名

如何在 Cython 中返回新的 C++ 对象?

Cython 生成的 C++ 代码中可能存在的错误

python导入的cython错误

通过 c++ 调用具有多个 pyx 文件的 cython 库

分发 Cython 生成的 cpp 文件