Cython:无法分配给二维向量

Posted

技术标签:

【中文标题】Cython:无法分配给二维向量【英文标题】:Cython: unable to assign to 2d vector 【发布时间】:2020-06-19 18:47:37 【问题描述】:

我有以下几点:

# distutils: language = c++
from libcpp.vector cimport vector

def foo():
    cdef vector[vector[int]] matrix 
    matrix.reserve(100);
    matrix[0] = [1,2,3]
    print(matrix)
foo()

它打印出一个空列表;我希望它打印出第一个元素为[1,2,3] 的向量。

Setup.py 脚本:

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='myfile',
    ext_modules=cythonize("my_file.pyx"),
    zip_safe=False,
)

我该如何解决这个问题?

【问题讨论】:

@bhristov 您具体要求什么?这在我的机器上编译并运行良好。如果有帮助,我已经编辑并添加了 setup.py 脚本。 【参考方案1】:

您应该使用matrix.resize(100) 而不是matrix.reserve(100)std::vector<>::reserve 不会改变向量的大小 - 它只保留内存,因此不需要发生进一步(多次)重新分配:

%%cython
...
matrix.reserve(100)
print(matrix.size())  # prints 0
matrix.resize(100)
print(matrix.size())  # prints 100
...

现在matrix[0] = [1,2,3] 是未定义的行为(大小为0 - 没有元素),你很不幸它不会因为超出范围的访问而崩溃。

【讨论】:

以上是关于Cython:无法分配给二维向量的主要内容,如果未能解决你的问题,请参考以下文章

Cython:将单个元素分配给多维内存视图切片

如何将numpy.ndarray分配给cython中nogil循环下的临时变量?

如何在 Cython 中声明指针向量?

在 cython 中快速访问稀疏矩阵:memoryview 与字典向量

cython中的二维数组切片

在 Cython 中包装返回复杂类型向量的函数