为了简单起见,我已经定义了一个没有从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__
方法不足以授权列表的数组转换。有什么想法吗?
答案 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]))