numpy - 将对象列表转换为数组,而无需子类化ndarray

时间:2014-08-21 20:50:50

标签: python arrays numpy

为了简单起见,我已经定义了一个没有从ndarray子类化的类(由于很多原因,我发现它非常复杂),但是有一个返回nd的__array__()方法。给定固定形状的数组。我们称这个班为Foo

在我的脚本中,我还生成了大量的Foo实例列表,我想将它们转换为数组的numpy数组。我可以使用地图功能轻松完成:

numpy.array(map(lambda x: numpy.array(x), [foo_1, ..., foo_n]))

它工作正常。我只是想知道如何让事情变得更加简单和高效,并让以下工作:

numpy.array([foo_1, ..., foo_n])

(实际上它返回一个"错误返回而没有异常设置" ...)。似乎提供__array__方法不足以授权列表的数组转换。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

numpy.array docs,您传入的对象必须满足:

  

数组,公开数组接口的任何对象,__array__方法返回数组的对象,或任何(嵌套)序列。

您实际上传递了list个foo对象,因此此列表不会公开数组接口,也没有array方法。这只留下它是否是嵌套序列。要成为嵌套序列,您的foo对象可能需要是可迭代的。是吗? (emulating python's container types

不确定这是否更好,但您可能会这样做:

numpy.array([numpy.array(x) for x in [foo_1, ..., foo_n]])

以下是Foo的示例,正​​如您所描述的那样。它输出你期望的ndarray(没有例外)。希望你可以用它作为例子:

import numpy as np

class Foo(object):
    def __init__(self):
        self.arr = np.array([[1, 2, 3], [4, 5, 6], [7,8,9]], np.int32)

    def __array__(self):
        return self.arr

    def __iter__(self):
        for elem in self.arr:
            yield elem

    def __len__(self):
        return len(self.arr)

    def __getitem__(self, key):
        return self.arr[key]

def main():
    foos = [Foo() for i in range(10)]
    print np.array(foos)


if __name__ == '__main__':
    main()

答案 1 :(得分:0)

这将更有效,更简洁,您不需要lambda地图:

numpy.array(map(numpy.array,[foo_1, ..., foo_n]))