我有两个用cython编写的cython ,我想在python的类中使用它们。

position.pyx

import numpy as np
cimport numpy as np
cimport cython
cpdef double std_G,v=4.3e-9, 299792.458 

cdef class cosmo(object):
    cdef public double o_m, o_l, h, w, o_r, G, v
    def __init__(self,double o_m = 0.3, double o_l = 0.7, double h = 0.7, double w = -1, double o_r = 0., double G = std_G):

        self.o_m = o_m
        self.o_l = o_l
        self.o_r = o_r
        self.h = h
        self.w = w
        self.G = G
        self.v = v

    def __copy__(self):

        return cosmo(o_m = self.o_m, o_l = self.o_l, h = self.h, w = self.w, o_r = self.o_r, G = self.G)

    property H0:
        def __get__(self):
            return 100*self.h  

    property M_solar:
        def __get__(self):
            return 1.989e30 

    property Mpc_to_m:
        def __get__(self):
            return 3.0856e22; 

    def hubble2(self, double z):
        cdef double inv_a
        inv_a = 1.+z
        return (self.o_r*inv_a**4 + self.o_m*inv_a**3 + \
                  self.o_l*(inv_a**(3*(1+self.w))) + (1 - self.o_m - self.o_l - self.o_r)*inv_a**2)*self.H0**2

    property hubble_length:
        def __get__(self):
            return self.v / self.H0

    def rc(self, double z):

        return 3.*self.hubble2(z)/(8*np.pi*self.G)

cdef class PositionsD(object):

     cdef double [:] _x
     property x:
         def __get__(self):
             return np.array(self._x)
         def __set__(self, np.ndarray[DTYPE_T, ndim=1] x):
             self._x = x

     cdef double [:] _y
     property y:
         def __get__(self):
             return np.array(self._y)
         def __set__(self, np.ndarray[DTYPE_T, ndim=1, mode='c'] y):
             self._y = y

     def __init__(self, np.ndarray[DTYPE_T, ndim=2, mode='c'] positions):
         self._x = positions[:,0]
         self._y = positions[:,1]

虽然我想在modelfit类中使用PositionsD类,而modelfit将继承PositionsD的属性:

from position import *
import numpy as np
class modelfit(PositionsD):
    cosmo = cosmo()
    def __init__(self):
        super(modelfit,self).__init__(shear_pos)

        self.arcsec2rad = 2*np.pi/180./3600.
        self.shear_g = None
        self.shear_pos = shear_pos *self.arcsec2rad
        self.shear_z = None
        self.halo_pos = None
        self.halo_z = None
        self.sigma_g = np.sqrt(np.std(self.shear_g[:,1]**2+self.shear_g[:,2]**2))/np.sqrt(2)
        self.n_model_evals = 0
        self.gaussian_prior_theta = [{'mean' : 14, 'std': 0.5}]
        self.rho_c= cosmo.rc(self.halo_z)

但是我收到以下错误消息:

>>> x=np.array([[0.3,-0.1],[1,3.4]])
>>> mf=modelfit(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 1 argument (2 given)

我不知道我在做什么错。 有什么建议吗?

===============>>#1 票数:2

在您当前的类定义中, __init__不需要任何参数。 这就是为什么在调用mf=modelfit(x)时引发错误。 由于不以其他方式定义shear_pos ,因此我假设您打算在类初始化时将其作为参数传递。 如果是这样,您应该写:

class modelfit(PositionsD):
    cosmo = cosmo()
    def __init__(self, shear_pos):
        super(modelfit,self).__init__(shear_pos)
        ...

===============>>#2 票数:0 已采纳

我发现我的应用程序使用PositionsD类的属性的最佳方法是按以下方式使用它:

from position import *
import numpy as np
class modelfit(object):
    def __init__(self):
        self.cosmo = cosmo()
        self.arcsec2rad = 2*np.pi/180./3600.
        self.shear_g = None
        self.source_pos = None
        self.shear_z = None
        self.halo_pos = None
        self.halo_z = None
        self.gaussian_prior_theta = [{'mean' : 14, 'std': 0.5}]
    def get_shear_pos(self): 
        return PositionsD(self.source_pos*self.arcsec2rad)

    shear_pos = property(get_shear_pos)

    def get_halo_center(self): 
        return PositionsD(self.halo_pos*self.arcsec2rad)

    halo_center = property(get_halo_center)

    def get_sigma_g(self):
        return np.sqrt(np.std(self.shear_g[:,1]**2+self.shear_g[:,2]**2))/np.sqrt(2)

    sigma_g = property(get_sigma_g)
    def get_rho_c(self):
        return self.cosmo.rc(self.halo_z)

    rho_c = property(get_rho_c)

我正在寻找的应用程序示例如下:

>>> m=modelfit()
>>> r=np.array([[0.2,-0.5],[2.1,9.3],[3.1,-2.8],[0.01,0.211]])
>>> m.source_pos=r
>>> m.shear_pos
<position.PositionsD object at 0x7f91a40e81e0>
>>> m.shear_pos.x
array([  1.93925472e-06,   2.03621746e-05,   3.00584482e-05,
         9.69627362e-08])
>>> m.shear_pos.x/m.arcsec2rad
array([ 0.2 ,  2.1 ,  3.1 ,  0.01])
>>> m.shear_pos.y/m.arcsec2rad
array([-0.5  ,  9.3  , -2.8  ,  0.211])

  ask by Dalek translate from so

未解决问题?本站智能推荐:

1回复

Cython-试图修改已经在超类中声明的子类中的函数,但是会发生错误

我在jupyter-notebook中编码了这四个类。 前两个类在python中,其他两个具有类似操作的类在cython中: 我在下面为python类运行代码,并且效果很好: 但是对于cy_child和cy_parent我得到这个错误: Signature not com
3回复

Cython / Python / C ++-继承:将派生类作为参数传递给需要基类的函数

我正在使用Cython包装一组C ++类,并允许它们使用Python接口。 下面提供了示例代码: BaseClass.h: DerivedClass.h: NextDerivedClass.h: InheritTest.pyx: 我希望能够在Python中
2回复

Cython:如何将python对象作为cython类的属性

我有一个现有的python类X ,我想做以下事情: 但这不是开箱即用的,cdef只接受C类型,而不是Python类。 任何解决方法?
1回复

Cython类的继承和C ++嵌入

我需要将Cython类嵌入一些C ++代码中,并且无法使继承起作用,并且在尝试访问基类的字段时会不断出现分段错误。 由于项目的限制,不可能包装C ++类或从Cython代码中删除这些类。 这是我的问题的简化示例: <<<文件:fooClass.pyx >>
1回复

Cython / python-cdef类列表

我正在尝试改进使用列表类型的代码: 当我从python调用addOrder时,问题就来了: 我猜是因为OrderC被识别为python对象,所以我必须使用cpdef定义setData。 但是我希望OrderC被视为cdef类,以提高性能。 请你帮助我好吗 ? 谢谢
3回复

泡菜cython类

我必须保存并加载一个cython类实例。 我的cython类是以及几种方法: 我在考虑使用cPickle模块。 我明白我必须实现一个__reduce __(自我)方法但是我有一些问题需要找到一个例子并且很好地理解文档 我试图将这样的东西添加到Perceptron_avg_my但
1回复

cython cdef类c方法:如何在没有python开销的情况下从另一个cython cdef类调用它?

我正在尝试在cython中实现通用排序算法。 因此,我创建了以下模块,该模块在类sorter_t内部实现了Heapsort算法: 当定义类型为sorter_t的对象时,必须提供一个sortable_object ,它具有cdef函数lt_c (用于比较一个元素是否小于另一个元素)和sw
3回复

Cython和C ++继承

我有2个班,A和B. B继承自A. //C++ class A { public: int getA() {return this->a;}; A() {this->a = 42;} private: int
1回复

在cython中声明一个类的实例

我对我声明类的实例的方式有疑问。 我有两个班,即宇宙学和NFWHalo 。 我需要在另一个中使用宇宙学类中的一些方法。 NFWHalo类 我当前的代码被编译但是当我在python中import它并尝试使用它时,它会引发此错误消息: 更新 我不相信我已经正确地声明了我的
1回复

Cython-具有numpy属性的类

我正在尝试通过使用cython扩展类型来优化python类。 我的操作使用的是numpy而没有建立索引,即分段加法,矩阵乘法,因此我的主要目标是减少python的开销。 我对类型声明最感兴趣:我应该使用numpy还是cython结构? 这是一个简单的例子: cdef class Ana