子类化了失去类型的空numpy-rearray,并在numpy1.8中添加了属性



我正在尝试实现numpy recarray(recsub)的子类,并将其实例分配给dtype"object"(ndarr)的ndarray。它工作得很好,但当子类化的recarray用一个空数组实例化时,我遇到了一个问题。这是子类recarry的代码:

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中不再有效!因此,在实例化具有形状()而不是(n)的重新阵列时,似乎缺少了一些东西

,欢迎任何建议

tnx提前,

我在dev1.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示例按预期运行。

相关内容

最新更新