gpt4 book ai didi

python - 赛通 "Cannot take address of memoryview slice"

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:12 29 4
gpt4 key购买 nike

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

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


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

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

数据.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 () {}

关于python - 赛通 "Cannot take address of memoryview slice",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60180703/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com