Numpy数组与自定义类的列表

时间:2017-09-21 17:46:51

标签: python arrays list class numpy

我理解为什么"标准"的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)

我可以使用

做得很好
self.myFoos = []

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

Foo类的复杂性是否会产生很大的影响? (在我的用例中,它包含20或30种标准类型,一个或两个固定大小的整数数组,然后是大约10种简单方法。)

myFoos中典型的Foos数量是否有所不同? (在我的用例中,它将是0到10)

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

P.S。虽然代码工作正常,但pyCharm并不喜欢上一个附加语句,它警告我

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

我之前已经讨论过制作自定义对象数组 - 我会尝试进行一次很好的讨论。

但是,首先是几个笔记

np.zeros(0, dtype = Foo)

确实是np.zeros(0, dtype=object)。有标准的dtypes,还有object。它保存指向内存中对象的指针。和列表一样,这些可以是任何内容 - 数字,字符串,列表,数组,Foo()None等。并且可以更改。

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

self.myFoos = np.append(self.myFoos, some_foo)

对象dtype列表与列表基本相同,只是它们可以重新形成为2d,并且它们不能与append一起增长。对象dtype数组上的许多操作都是使用列表推导来执行的。

Replace elements in array with class instances

Pass output from class instance as input to another

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