如何规避对字段名称的限制?

时间:2015-09-29 00:00:35

标签: python-2.7 numpy recarray

如果我用一个名为data的字段定义一个recarray r,如下所示

import numpy
r = numpy.zeros( 1, numpy.dtype([('data', 'f8')]) ).view(numpy.recarray )

数据字段将引用一些内部重新排列缓冲区而不是浮点数。的确,正在运行

r.data

产量

<read-write buffer for 0x7f3c10841cf8, size 8, offset 0 at 0x7f3c1083ee70>

而不是[0]。我怀疑失败的原因是recarray已经有一个名为data的成员,因此它只是忽略了我的数据字段。如果我尝试使用已存在的重新存储成员的任何名称,也会出现同样的问题。

我的问题是:

1)是否有可能规避这种重新限制的限制以及如何做到这一点?

2)将来可能会解除这种限制吗?

1 个答案:

答案 0 :(得分:3)

以下是getattribute的{​​{1}}方法。 Python将recarray翻译为obj.par1。这可以解释为什么字段名称在重组时使用时必须是有效的属性名称。

obj.__getattribute__('par1')

def __getattribute__(self, attr): try: return object.__getattribute__(self, attr) #** except AttributeError: # attr must be a fieldname pass fielddict = ndarray.__getattribute__(self, 'dtype').fields try: res = fielddict[attr][:2] except (TypeError, KeyError): raise AttributeError("record array has no attribute %s" % attr) obj = self.getfield(*res) # if it has fields return a recarray, otherwise return # normal array if obj.dtype.fields: return obj if obj.dtype.char in 'SU': return obj.view(chararray) return obj.view(ndarray) 行解释了**返回缓冲区指针的原因,而不是您的字段。同样适用于&#39; shape&#39;并且大步前进了。这也使得访问数组方法成为可能。你希望recarray的行为尽可能像常规数组一样,不是吗?

结构化数组中的字段名称类似于字典的键,相对自由的形式(尽管我从未探索过限制)。但在obj.data中,这些名称还必须具有属性名称。属性名称必须是有效的变量名称 - 这是Python约束。

https://stackoverflow.com/a/32540939/901925我引用了recarray文档:

  

具有结构化dtype的Numpy数组也可以被视为重新排列,其中可以像访问属性一样访问字段。出于这个原因,我们可能需要确保字段名称不包含任何空格或无效字符,或者它不符合标准属性的名称(如大小或形状),这会使解释器混淆。

Python类的教程也说:

  

属性引用使用Python中所有属性引用使用的标准语法:obj.name。有效的属性名称是创建类对象时类的命名空间中的所有名称。   https://docs.python.org/2/tutorial/classes.html#tut-object