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

标签 python arrays numpy

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

相关文章:

python - Numpy 和 Pandas : Return histogram values from pandas histogram plot?

python - 如何在 Python 中对列表运行算法并将结果存储在列表中?

python - 为组创建唯一的 id

python - 在 for 循环中自动更改索引

python - Okta PySAML2 示例应用程序 : IP-Initiated Works but SP-Initiated Fails

java - 代码在应该打印最大值和最小值时打印出数组的最大下标

java - 在mysql中通过java数组计算列中的行数

python - MySQL 服务器已经消失 - 通过结帐事件处理程序的断开连接处理不起作用

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

python - 确定一个值是否超过另一个值的函数