Numpy 数组与自定义类的列表

lev*_*eer 3 python arrays numpy class list

我理解为什么“标准”类型的 numpy 数组几乎总是比包含相同类型数据的列表更有效。因此,最好养成使用 numpy 数组来做简单事情的习惯,是吗?

但是,我想知道与使用列表相比,使用 numpy 数组“存储”自定义类实例的优点和缺点是什么。

考虑

import numpy as np

class Foo:
    def __init__(self, name):
        self.name = name

class Bar:
    def __init__(self, name):
        self.name = name
        self.myFoos = np.zeros(0, dtype = Foo)

    def add_foo(self, some_foo):
        self.myFoos = np.append(self.myFoos, some_foo)
Run Code Online (Sandbox Code Playgroud)

我可以用做的很好

self.myFoos = []
Run Code Online (Sandbox Code Playgroud)

做出这个决定时我应该记住什么?

Foo 类的复杂性有很大区别吗?(在我的用例中,它可能包含 20 或 30 个标准类型、一两个固定大小的整数数组,然后是大约 10 个简单方法。)

myFoos 中的 Foos 数量通常会产生影响吗?(在我的用例中,它将是 0 到 10)

myFoos 被处理的次数有影响吗?(在我的实际用例中,在用户操作之间可能会调用 10 到 20 次。)

Ps 虽然代码工作正常,但 pyCharm 不喜欢最后一个附加语句,它警告我

Expected type 'Union[ndarray, iterable]' got 'Foo' instead.
Run Code Online (Sandbox Code Playgroud)

提前致谢!

hpa*_*ulj 7

我之前已经讨论过制作自定义对象数组 - 我会尝试查找一个好的讨论。

但是,首先要注意几点

np.zeros(0, dtype = Foo)
Run Code Online (Sandbox Code Playgroud)

真的是np.zeros(0, dtype=object)。有标准的 dtypes,还有object. 它保存指向内存中其他位置的对象的指针。与列表一样,这些可以是任何东西 - 数字、字符串、列表、数组Foo()、、None等。并且可以更改。

保持距离np.append。它不是列表附加的良好替代品。如果您必须使用其他数组创建一个新数组,请学习使用concatenate(包括正确获取维度)。

self.myFoos = np.append(self.myFoos, some_foo)
Run Code Online (Sandbox Code Playgroud)

对象 dtype 列表与列表基本相同,只是它们可以重塑为 2d,并且不能随append. 对象数据类型数组上的许多操作都是通过列表推导式执行的。


用类实例替换数组中的元素

将类实例的输出作为另一个实例的输入

我回答了这张海报(大约在同一时间范围内搜索)中尝试使用自定义类数组的几个问题。仅访问此类对象的属性就需要列表理解。