如果我用一个名为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)将来可能会解除这种限制吗?
答案 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