子块空numpy recarray丢失其类型并在numpy 1.8中添加属性

时间:2013-12-05 19:54:21

标签: python numpy attributes subclass recarray

我正在尝试实现numpy recarray(recsub)的子类,并将其实例分配给dtype'object'(ndarr)的ndarray。它运行良好,但是当使用空数组实例化子类重新构造时,我遇到了问题。这是子类重构的代码:

class recsub(numpy.recarray):
"""subclassed recarray"""

def __new__(cls, *args, **kwargs):

    obj = numpy.recarray.__new__(cls, *args, **kwargs)

    return obj

def __init__(self, *arg, **kwargs):

    self.x = -1

def new_method(self):
    print 'new_method() : fooooooooooooo'

我创建了ndarray:

ndarr = numpy.ndarray(5, 'object')

现在如果我创建两个recsub实例:

ndarr[0] = recsub(2, [('a','f8')])
ndarr[1] = recsub((), [('a','f8')])

现在这里发生了奇怪的事情。输出:

print type(ndarr[0])
print type(ndarr[1])

是:

>>> <class '__main__.recsub'>
>>> <class 'numpy.core.records.record'>

所以我无法访问ndarr [1] .x

这曾经在numpy 1.7中工作,但不再是numpy 1.8!因此,在使用shape()而不是(n)

实例化recarray时似乎缺少某些东西

欢迎提出任何建议,

提前tnx,

1 个答案:

答案 0 :(得分:1)

我在dev 1.9中使用更简单的数组

获得了类似的行为
ndarr = np.ndarray(2,dtype=np.object)
x = np.array([1,2])
ndarr[0] = x
y = np.array(3)
ndarr[1] = y
type(ndarr[0])
# numpy.ndarray
type(ndarr[1])
# numpy.int32
ndarr
# array([array([1, 2]), 3], dtype=object)

因此形状为()的数组会作为标量插入ndarr

我不知道这是否是1.7和1.8之间某些变化的错误,功能或预期后果。我想首先看的是1.8的发行说明。

此问题可能相关:https://github.com/numpy/numpy/issues/1679

array([array([]), array(0, object)])
array([array([], dtype=float64), 0], dtype=object)

通过错误修复https://github.com/numpy/numpy/pull/4109,以array存储的项目以相同的方式返回(而不是作为标量)。

type(ndarr[1])
# <type 'numpy.ndarray'>
ndarr
# [array([1, 2]) array(3)]
# [array([], dtype=float64) array(0, dtype=object)]
# [array([], dtype=float64) 0]

OP示例按预期运行。