自定义类的Numpy数组与列表

2024-04-24 09:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我理解为什么“标准”类型的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)

我可以很好地使用

^{pr2}$

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

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

myFoos中典型的foo数量有什么不同吗? (在我的用例中,它将是0到10)

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

尽管代码运行良好,但pyCharm不喜欢最后一个append语句,它警告我

Expected type 'Union[ndarray, iterable]' got 'Foo' instead.

提前谢谢!在


Tags: nameselfnumpy类型列表标准fooinit
1条回答
网友
1楼 · 发布于 2024-04-24 09:32:42

我之前已经讨论过如何生成自定义对象的数组—我将尝试查找一个好的讨论。在

但是,首先要注意几点

np.zeros(0, dtype = Foo)

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

远离np.append。它不是list append的好替代品。如果必须使用其他数组创建一个新数组,请学习使用concatenate(这包括正确获取维度)。在

^{pr2}$

{7}它们基本上与cdype列表相同,但它们不能用2d}来改变它们的形状。对象数据类型数组上的许多操作都是通过列表理解来执行的。在


Replace elements in array with class instances

Pass output from class instance as input to another

我回答了这个海报上的几个问题(在同一时间段内搜索),他试图使用自定义类的数组。仅仅访问这样一个对象的属性就需要一个列表理解。在

相关问题 更多 >