【问题标题】:Defining numpy.array in the __init__ function of a class在类的 __init__ 函数中定义 numpy.array
【发布时间】:2014-06-04 15:46:49
【问题描述】:

我对在 python 中编写 不是很熟悉,我正在尝试为我的应用程序修改一个编写的类。问题是我想将halo_pos 参数作为输入提供给以下NFW 类:

class NFW(object):
    _req_params = { 'mass' : float , 'conc' : float , 'redshift' : float }
    _opt_params = { 'halo_pos' :[float,float]  , 'omega_m' : float , 'omega_lam' : float }
    _single_params = []
    _takes_rng = False
    _takes_logger = False

    def __init__(self, mass, conc, redshift, halo_pos, 
                 omega_m=None, omega_lam=None, cosmo=None):
        self.M = float(mass)
        self.c = float(conc)
        self.z = float(redshift)
        self.halo_pos.x = float(halo_pos[0])
        self.halo_pos.y = float(halo_pos[1])  
        self.cosmo = cosmo

如果我将halo_pos 的输入传递给以下参数

>>> Xpos.value
array(235.0)
>>> type(Xpos.value)
<type 'numpy.ndarray'>
>>> Ypos.value
array(340.0)
omega_matter=0.23;omega_lambda=0.77

然后,当我尝试使用给定的输入调用 NFW 类时,我收到以下错误消息:

nfw = nfw_halo.NFWHalo(mass=M,conc=concentration,redshift=z_halo,halo_pos=[Xpos,Ypos],omega_m=omega_matter,omega_lam=omega_lambda)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "nfw_halo.py", line 156, in __init__
    self.halo_pos.x = float(halo_pos[0])
AttributeError: 'NFWHalo' object has no attribute 'halo_pos'

我应该如何为我的班级定义 halo_pos 以避免引发错误消息?

【问题讨论】:

  • 你能给我们一个 MWE 吗?
  • @andi 大多数新用户都不知道 MWE 是什么。与新用户一起发帖时避免使用首字母缩略词。
  • 对不起,我自己是新手,看到大家都用过。我将来会避免这种情况。感谢您的提示。
  • @andi 为什么类不为 massconc 参数引发错误消息?
  • 因为对于 pos.x 和 pos.y,你期望一个类型有一个 x 和一个 y 分量可以用“.”来寻址。 python 应该如何知道你将要创建什么?

标签: python python-2.7 python-3.x numpy scipy


【解决方案1】:

您没有声明您在 init 部分中分配的 halo_pos 变量。

class NFW(object):
    _req_params = { 'mass' : float , 'conc' : float , 'redshift' : float }
    _opt_params = { 'halo_pos' :[float,float]  , 'omega_m' : float , 'omega_lam' : float }
    _single_params = []
    _takes_rng = False
    _takes_logger = False
    halo_pos = None

    def __init__(self, mass, conc, redshift, halo_pos, 
                 omega_m=None, omega_lam=None, cosmo=None):
        self.M = float(mass)
        self.c = float(conc)
        self.z = float(redshift)
        self.halo_pos = halo_positions(halo_pos)
        self.cosmo = cosmo

        print(str(self.halo_pos.x),str(self.halo_pos.y))

class halo_positions(object):
    x = None
    y = None
    def __init__(self,positions):
        self.x = positions[0]
        self.y = positions[1]

if __name__ == '__main__':
    nfw = NFW(mass=1.23,conc=2.34,redshift=3.45,halo_pos=[4.56,5.67],omega_m=1.111,omega_lam=1.222)

因此,一旦 init 完成,您的声明 self.halo_pos.x 和 self.halo_pos.y 就会被清除。

【讨论】:

  • 抱歉,我之前没有注意到,.x 和 .y 可能是问题所在。您是否也创建了 halo_pos 类?如果不是,那么您将不得不在变量名中使用其他内容而不是“。”。我已经更新了我的示例来向您展示。
  • 您应该将halo_pos.x = Nonehalo_pos.y = None 更改为halo_pos = None 然后他可以将halo_pos 定义为他想要的任何对象,即使他需要他也可以使用halo_pos.xhalo_pos.y 如果相应地定义。
  • @Zifendale 这两个声明有什么区别。我已根据您的建议进行了更改,但我再次收到类似的错误消息`文件“nfw_halo.py”,第 156 行,在 init self.c = float(conc) AttributeError: 'NFWHalo' object has no属性“halo_pos”。 `
  • halo_pos 的每个组件都是一个numpy 数组时,我在_opt_params 中定义halo_pos 的方式好吗?
  • @Dalek andi 的回答可能是最好的建议。正如我所指出的,没有为该类定义 halo_pos 对象。如果您正确定义它以使其具有 .x 和 .y 属性,那么它应该可以工作。我会相应地更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2014-03-20
  • 2012-09-20
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多