为了简单起见,我定义了一个类,它不是 ndarray
的子类(由于很多原因我觉得它很复杂),但有一个 __array__()
返回给定固定形状的 nd.array 的方法。我们称这个类为 Foo
。
在我的脚本中,我还生成了大量 Foo 实例列表,我想将它们转换为数组的 numpy 数组。我可以使用 map 功能轻松完成:
numpy.array(map(lambda x: numpy.array(x), [foo_1, ..., foo_n]))
而且效果很好。我只是想知道如何让事情变得更加简单和高效,并让以下内容发挥作用:
numpy.array([foo_1, ..., foo_n])
(实际上它返回一个“没有设置异常的错误返回”...)。似乎提供 __array__
方法不足以授权列表的数组转换。有什么想法吗?
最佳答案
来自numpy.array docs ,你传入的对象必须满足:
An array, any object exposing the array interface, an object whose
__array__
method returns an array, or any (nested) sequence.
您实际上传递了一个 foo 对象的 list
,所以这个列表没有公开数组接口(interface),也没有 array
方法。这只剩下它是否是嵌套序列。要成为嵌套序列,您的 foo 对象可能需要是可迭代的。他们是吗? ( emulating python's container types )
不确定这是否更好,但您可能会这样做:
numpy.array([numpy.array(x) for x in [foo_1, ..., foo_n]])
如您所述,这是 Foo
的示例。它输出您期望的 ndarray(无一异常(exception))。希望您可以将其用作示例:
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()
关于python - numpy - 在不继承 ndarray 的情况下将对象列表转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435710/