- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是最奇怪的错误,我正在尝试从返回一个 vector 的 reference 的 c++ 函数中获取一个 numpy 数组,整个数组使用 Cython 进行包装。
我可以让它工作返回一个 vector<int>
而不是 vector<int>&
,但我想了解在使用引用时发生了什么。这是重现错误的一种方法:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <vector>
#include <string>
namespace vec {
class IntVector {
private:
std::vector<int> vec;
public:
IntVector();
virtual ~IntVector();
std::vector<int>& get_vec(); #return a reference !
};
}
#endif
#include "cmyclass.h"
#include <iostream>
using namespace vec;
IntVector::IntVector(){
for(int i=10; i<20; ++i){
vec.push_back(i);
}
}
IntVector::~IntVector(){
}
std::vector<int>& IntVector::get_vec(){
std::vector<int> buff;
buff.reserve(vec.size());
for(int i=0; i<vec.size(); ++i){
buff.push_back(vec[i]);
}
return buff;
}
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector
cdef extern from "cmyclass.h" namespace "vec":
cdef cppclass IntVector:
IntVector() except +
vector[int]& get_vec()
cdef class IntVec:
cdef IntVector* _thisptr
def __cinit__(self):
self._thisptr = new IntVector()
def __dealloc__(self):
del self._thisptr
def __init__(self):
pass
def get_vec(self):
cdef vector[int] buff;
buff = self._thisptr.get_vec();
return np.asarray(buff)
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
sourcefiles = ['myclass.pyx', 'cmyclass.cc']
compile_opts = ['-std=c++11']
ext=[Extension('*',
sourcefiles,
extra_compile_args=compile_opts,
language='c++')]
setup(
ext_modules=cythonize(ext)
)
您可以使用 python setup.py build_ext --inplace
进行编译
>>> import myclass
>>> vec = myclass.IntVec()
>>> vec.get_vec()
array([ 0, 0, 12, 13, 14, 15, 16, 17, 18, 19])
您可以看到前两个值设置为零(它们应该是 10 和 11)!如果我们返回一个 vector<int>
代码就可以正常工作而不是对 vector<int>
的引用.
知道为什么会这样吗?
将 vector 作为参数传递。
#ifndef MYCLASS_H
#define MYCLASS_H
#include <vector>
#include <string>
namespace vec {
class IntVector {
private:
std::vector<int> vec;
public:
IntVector();
virtual ~IntVector();
void get_vec(std::vector<int>&);
};
}
#endif
#include "cmyclass.h"
#include <iostream>
using namespace vec;
IntVector::IntVector(){
for(int i=10; i<20; ++i){
vec.push_back(i);
}
}
IntVector::~IntVector(){
}
void IntVector::get_vec(std::vector<int>& buff){
buff.reserve(vec.size());
for(int i=0; i<vec.size(); ++i){
buff.push_back(vec[i]);
}
return buff;
}
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector
cdef extern from "cmyclass.h" namespace "vec":
cdef cppclass IntVector:
IntVector() except +
void get_vec(vector[int]&)
cdef class IntVec:
cdef IntVector* _thisptr
def __cinit__(self):
self._thisptr = new IntVector()
def __dealloc__(self):
del self._thisptr
def __init__(self):
pass
def get_vec(self):
cdef vector[int] buff;
self._thisptr.get_vec(buff);
return np.asarray(buff)
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
sourcefiles = ['myclass.pyx', 'cmyclass.cc']
compile_opts = ['-std=c++11']
ext=[Extension('*',
sourcefiles,
extra_compile_args=compile_opts,
language='c++')]
setup(
ext_modules=cythonize(ext)
)
最佳答案
您的主要目标似乎是让 numpy 使用在 C++ vector 中分配的内存。为此,您最好为 IntVec
实现缓冲协议(protocol)。 Cython 文档给出了 Matrix class based around a vector 的示例你可以简化(因为你的情况只是一维)。您真正需要做的就是创建函数 __getbuffer__
和 __releasebuffer__
(后者可以为空,如示例文档中所示)。 (我不认为在此处复制/粘贴文档有很大的值(value))
这样做将允许您将 IntVec
直接传递给 np.asarray
。生成的 numpy 数组将使用 IntVec
进行存储,并保留对 IntVec
的引用以确保它不会被删除。您还可以将 Cython 内存 View 与此类一起使用(如果有帮助的话)。
关于python - Cython:从引用中获取时,Numpy 数组缺少两个第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263108/
c 不做边界检查。那么cython是如何检查是否编译成c的呢? %%cython --annotate cimport cython @cython.boundscheck(True) cpdef m
可以直接声明用于 Cython 构造函数? 据我了解,这是可能的: # Cython cdef int[3] li = [1, 2, 3] # C++ int[3] li = {1, 2, 3} 但
所以,如果你有一个头文件。 %%file test.h struct mystruct{ int i; int j; }; 然后你将它包装在 Cython 中: cdef extern fr
我正在构建一个独立于平台的 cython 项目,我想根据正在使用的编译器传递编译器参数。我可以猜测基于平台的编译器,或者假设它与用于 Python 的编译器相同,但不能保证匹配。通常我注入(injec
我使用诗歌构建我的 cython 包。我在所有函数和类中都有 NumPy 风格的文档字符串。我现在要做的是添加 Sphinx 自动文档并发布在 Read the Docs。 我已阅读此主题 How d
赛通 libcpp模块包含 priority_queue 的模板,这很好,除了一件事:我不能通过自定义比较器(或者,至少,我不知道如何)。 我需要这个,因为我需要 priority_queue做一个a
以下代码定义了一个简单的 Cython 函数(为方便起见,使用 Ipython 魔法)。 %load_ext cython %%cython def f(float x, float y=2):
我正在尝试使用 cython 进行复数计算。在示例代码中,我想计算复数的复指数函数。问题是我不知道如何将我的整数乘以虚数单位。python的虚数单位1.0j乘以cython执行时报错。 这是我的代码:
在这里停留在一些基本的 Cython 上 - 在 Cython 中定义字符串数组的规范且有效的方法是什么? 具体来说,我想定义一个定长常量数组char . (请注意,此时我不想引入 NumPy。) 在
是否有可能,如果是,如何确定 Cython 中整数数据类型的大小(以位为单位)? 我正在尝试做这样的事情,以获得整数大小: cdef WORD_BITS = 0 IF sizeof(unsigned
我只是想打印 cython 变量的地址,但我无法绕过错误消息: cdef int myvar print &myvar 抛出 Cannot convert 'int *' to Python obje
我有一个 C 头文件,它在宏中定义了一个函数。我需要从 Cython 调用它。有没有办法在 Cython 中使用宏并使其完全扩展?我已经有了 C 类型的参数。 我尝试像使用函数一样使用 cdef,我认
令人惊讶的是,我似乎找不到通过名称获取结构体元素的单个示例(无论是在网络上还是在 cython 示例中)。 所以我收到了一个指向 C 函数结构体的指针,并且想要一一访问这些元素并将它们重新打包到 py
我尝试围绕 C++ 库编写一个 Cython 包装器 http://primesieve.org/ 它包装了一个函数count。到目前为止,它可以正确安装 python setup.py instal
我正在尝试将 cython 模块 data.pyx 导入另一个 cython 模块 user.pyx。一切都编译得很好,但是当我尝试在 python 模块中调用 user.pyx 时,我收到错误“Im
更新:内存 View 获胜。Cython 使用类型化内存 View :0.0253449 特别感谢 lothario,他指出了几个关键的变化。 荒谬。当然现在的问题是,似乎不能对它们做太多算术(加法和
我有一个使用 memoryview 数组的 cython 模块,即... double[:,:] foo 我想使用多处理并行运行这个模块。但是我得到了错误: PicklingError: Can't
我正在尝试使用 Cython 加速 PEP 484 类型的 python 脚本。我想保持一些语义和可读性。 之前,我有一个 Flags = int def difference(f1: Flags,
这个问题已经有答案了: Collapse multiple submodules to one Cython extension (5 个回答) 已关闭 3 年前。 我在一个包中有多个 .py 文件
我已经能够在我的 .pyx 脚本上使用 cython 在 linux 上创建一个 .so 文件。我也可以成功地在我的 python 解释器上进行导入。 我的问题是如何在不使用 cython 的情况下将
我是一名优秀的程序员,十分优秀!