赛通"Cannot take address of memoryview slice"

Cython "Cannot take address of memoryview slice"

本文关键字:memoryview slice of take Cannot 赛通 address      更新时间:2023-10-16

我在Cython中创建一个简单的类时遇到问题。很少有与处理C++包装器中数组的内存视图相关的文档。我想创建一个具有时间、x、y 和 z 属性的数据类。我需要这些属性是数组,最终可以在 Python 中调用。我以前使用 numpy 类型进行过这项工作,但我想使用 memoryviews 正确执行此操作。我的背景C++并不强。目前,我只是想让时间属性与单元素一维数组一起使用。当我尝试构建扩展时,出现以下错误:

self.c_data = new _Data(&date[1], x, y, z)
^
------------------------------------------------------------

data.pyx:18:32: Cannot take address of memoryview slice

如果我无法获取内存视图切片的地址,如何初始化我的类属性?这是相关代码。

数据.pyx

# distutils: language = c++
import numpy as np
cimport numpy as np
from cython.view cimport array as cvarray
from . cimport Data

cdef class Data:
cdef _Data *c_data
cdef long[::1] date
def __cinit__(self, long[::1] *date, x, y, z):

self.c_data = new _Data(&date[1], *date, x, y, z)
self.date = cvarray(shape=(1), itemsize=sizeof(long), format="i")

def __dealloc__(self):
del self.c_data

数据.pxd

cdef extern from "data extern.cpp":
pass
cdef extern from "data extern.h":
cppclass _Data "Data":
long date[1]
double x, y, z
Data() except +
_Data(long[:], double, double, double) except +

data_extern.h

#ifndef DATA_EXTERN_H
#define DATA_EXTERN_H
class Data {
public:
long date[1];
double x, y, z;
Data();
Data(long date[1], double x, double y, double z);
~Data();
};
#endif

data_extern.cpp

#include <iostream>
#include "data extern.h"
// Default constructor
Data::Data () {}
// Overloaded constructor
Data::Data (long date[1], double x, double y, double z) {
this->date = date[0];
this->x = x;
this->y = y;
this->z = z;
}
// Destructor
Data::~Data () {}

我的代码可能存在其他问题。如果有人对我如何创建一个可从 python 调用并使用 cython memoryviews 的类有任何见解,将不胜感激。

我不能说我完全理解我所做的事情,但是在回到我遵循的原始指导后,我能够让它工作。我收到的指导是来自 https://www.youtube.com/watch?v=6ukI-NlIzqY 的视频和可以从 https://github.com/kwmsmith/scipy2013-cython-tutorial/blob/master/Cython.pdf 观看的随附幻灯片。

以下是相关文件。

数据.pyx

# distutils: language = c++
cdef class Data:
cdef _Data *c_data
cdef long[::1] date
def __cinit__(self, long[::1] date, x, y, z):
self.c_data = new _Data(&date[0], x, y, z)
def __dealloc__(self):
del self.c_data
@property
def date(self):
return self.c_data.date
@date.setter
def date(self, date):
self.c_data.date = date
@property
def x(self):
return self.c_data.x
@x.setter
def x(self, x):
self.c_data.x = x
@property
def y(self):
return self.c_data.y
@y.setter
def y(self, y):
self.c_data.y = y
@property
def z(self):
return self.c_data.z
@z.setter
def z(self, z):
self.c_data.z = z

数据.pxd

cdef extern from "data extern.cpp":
pass
cdef extern from "data extern.h":
cppclass _Data "Data":
long date[1]
double x, y, z
Data() except +
_Data(long*, double, double, double) except +

数据外部.h

#ifndef DATA_EXTERN_H
#define DATA_EXTERN_H
class Data {
public:
long *date;
double x, y, z;
Data();
Data(long date[1], double x, double y, double z);
~Data();
};
#endif

数据外部.cpp

#include <iostream>
#include "data extern.h"
// Default constructor
Data::Data () {}
// Overloaded constructor
Data::Data (long *date, double x, double y, double z) {
this->date = &date[0];
this->x = x;
this->y = y;
this->z = z;
}
// Destructor
Data::~Data () {}