gpt4 book ai didi

python - numpy - 在不继承 ndarray 的情况下将对象列表转换为数组

转载 作者:太空狗 更新时间:2023-10-30 01:22:11 25 4
gpt4 key购买 nike

为了简单起见,我定义了一个类,它不是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com