如果我定义一个recarray r,它有一个名为data的字段,如下所示
import numpy
r = numpy.zeros( 1, numpy.dtype([('data', 'f8')]) ).view(numpy.recarray )数据字段将引用某个内部recarray缓冲区,而不是浮点数。确实,跑步
r.data收益率
<read-write buffer for 0x7f3c10841cf8, size 8, offset 0 at 0x7f3c1083ee70>而不是。我怀疑失败的原因是recarray已经有一个名为data的成员,因此它只是忽略了我名为data的字段。如果我尝试使用已存在的recarray成员的任何名称,也会出现同样的问题。
我的问题是:
1)有可能绕过recarray的这个限制吗?如何做到?
2)这一限制将来可能会取消吗?
发布于 2015-09-29 09:32:12
下面是recarray的getattribute方法。Python将obj.par1转换为obj.__getattribute__('par1')。这就解释了为什么在recarray中使用时,字段名必须是有效的属性名。
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)**行解释了为什么obj.data返回缓冲区指针,而不是您的字段。同样的情况也适用于“形状”和“步幅”。这也使得访问数组方法成为可能。您希望recarray的行为尽可能地像常规数组一样,不是吗?
结构化数组中的字段名称就像字典中的键,形式相对自由(尽管我从未探索过限制)。但在recarray中,这些名称还必须具有属性名称的功能。属性名必须是有效的变量名--这是一个Python约束。
在https://stackoverflow.com/a/32540939/901925中,我引用了genfromtxt文档:
具有结构化数据类型的recarray数组也可以看作
数组,其中字段可以被访问,就像它是属性一样。出于这个原因,我们可能需要确保字段名不包含任何空格或无效字符,或者它不对应于标准属性的名称(如大小或形状),这会使解释器感到困惑。
还有一篇关于Python类的教程说:
Python属性引用使用用于
中所有属性引用的标准语法: obj.name。有效的属性名称是创建类对象时在类的命名空间中的所有名称。https://docs.python.org/2/tutorial/classes.html#tut-object
https://stackoverflow.com/questions/32833609
复制相似问题