Python Cython“;无法为cdef类、结构或联合中的字段指定默认值;

Python Cython“;无法为cdef类、结构或联合中的字段指定默认值;,python,arrays,python-3.x,cython,cythonize,Python,Arrays,Python 3.x,Cython,Cythonize,我第一次尝试将Python代码移植到Cython。我在C方面的经验非常有限。我正在尝试创建一个相对简单的类来存储多维数组。对于这个问题,让我们将其留给一个长度为1的一维数组作为属性time。目前,我收到错误信息: cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64) ^ -------------------------

我第一次尝试将Python代码移植到Cython。我在C方面的经验非常有限。我正在尝试创建一个相对简单的类来存储多维数组。对于这个问题,让我们将其留给一个长度为1的一维数组作为属性time。目前,我收到错误信息:

    cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)
                                       ^
------------------------------------------------------------
data.pyx:22:40: Cannot assign default value to fields in cdef classes, structs or unions
以下是最相关的文件

data.pyx

import numpy as np
cimport numpy as np


cdef extern from "data_extern.h":

    cppclass _Data "Data":

        np.int64_t time64[1]
        double x_coord, y_coord, z_coord
        _Data(np.int64_t *time, double x, double y, double z)


cdef class Data:

    cdef _Data *thisptr
    cdef np.ndarray[np.int64_t, ndim=1] time = np.empty([1], dtype=np.int64)

    def __cinit__(self, np.int64_t time[1], x, y, z):
        self.thisptr = new _Data(&time[0], x, y, z)

    def __dealloc__(self):
        del self.thisptr
数据_extern.h

#ifndef DATA_EXTERN_H
#define DATA_EXTERN_H

class Data {
    public:
        signed long long time64[1];
        double x_coord, y_coord, z_coord;
        Data();
        Data(signed long long time[1], double x, double y, double z;
        ~Data();
};

#endif
数据_extern.cpp

#include <iostream>
#include "data_extern.h"

Data::Data () {}

// Overloaded constructor
Data::Data (signed long long time[1], double x, double y, double z {
    this->time64 = time[0];
    this->x_coord = x;
    this->y_coord = y;
    this->z_coord = z;
}

// Destructor
Data::~Data () {}
#包括
#包括“数据\u extern.h”
数据::数据(){}
//重载构造函数
数据::数据(有符号长时间[1],双x,双y,双z{
此->时间64=时间[0];
这->x_坐标=x;
这->y_坐标=y;
这->z_坐标=z;
}
//析构函数
数据::~Data(){}

我知道我的代码可能存在多个问题,但如果有人能对错误消息提供解释,我将不胜感激。

问题如错误消息中所述:您无法为cdef类的C级属性设置默认值。您可以通过在
中设置值来解决此问题__构造函数,如下所示:

cdef class Data:
    cdef _Data *thisptr
    cdef np.ndarray[np.int64_t, ndim=1] time

    def __cinit__(self, np.int64_t time[1], x, y, z):
        self.thisptr = new _Data(&time[0], x, y, z)
        self.time = np.empty([1], dtype=np.int64)

    def __dealloc__(self):
        del self.thisptr

作为一个提示,整个NP.NDARRY语法都是过时的。除非你死掉了使用NUMPY类型(因为你与某种C++库接口),所以你的代码看起来不必要。,您可以使用更现代的语法。您可以使用

从libc.stdint cimport*
导入大小的整数类型,以使用这些类型而不是numpy类型。

是的。这确实让我通过了默认值错误。我将改为尝试memoryview语法。谢谢!我在这里用memoryview提供了另一种解决方案,尽管它不一致使用长数组而不是长长数组。