包含可迭代对象的Numpy数组

时间:2014-03-10 00:34:16

标签: python numpy

通常可以将任意对象放入numpy数组中:

class Foo(object):
    pass
np.array([ Foo() ])
>>> array([<__main__.Foo object at 0x10d7c3610>], dtype=object)

但是,实现__len____getitem__的对象似乎会自动“解压缩”:

class Foo(object):
    def __len__(self): return 3
    def __getitem__(self, i): return i*11
np.array([ Foo() ])
>>> array([[0, 11, 22]])

有没有办法阻止numpy以这种方式解包对象?我想要的是将一些对象放入一个numpy数组中,并将它们作为对象本身存储,而不是解压缩。所以期望的行为是:

class Foo(object):
    def __len__(self): return 3
    def __getitem__(self, i): return i*11
np.array([ Foo() ])
>>> array([<__main__.Foo object at 0x10d7c3610>], dtype=object)

现在我明白了鸭子打字的想法意味着numpy应该解压缩看起来像列表的东西。但也许有可能以某种方式标记类Foo以告诉numpy不要解压缩它?例如,ABC就像:

numpy.Nonenumerable.register(Foo)

3 个答案:

答案 0 :(得分:3)

x = numpy.empty(appropriate_shape, dtype=object)
x[:] = your_list_of_foos

例如,对于1 Foo的1维数组,

x = numpy.empty([1], dtype=object)
x[:] = [Foo()]

这样做的好处是可以处理您无法控制的类型,或者系统的其他部分可能希望解压缩。例如,如果您希望将2个列表的列表视为列表的一维数组,

x = numpy.empty([2], dtype=object)
x[:] = [[], []]

答案 1 :(得分:0)

numpy的目的是处理数字。因此,预计解压缩这些列表将是一维数组中的正确行为(I.E.您正在生成向量的串联)。

您可能想要的是n-dimensional array,或者matrix

或者我相信您可以使用array constructor

的可选参数获得所需的结果
np.array(MyListOfLists, dtype = list)

答案 2 :(得分:0)

或许将类似数组的对象包含在容器中?

class Bar():
    def __init__(self):
        self.foo = Foo()

np.array([栏()])

相关问题