我理解为什么"标准"的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.
提前致谢!
答案 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
我回答了这个海报的几个问题(在同一时间范围内搜索),他们试图使用自定义类的数组。只需访问此类对象的属性就需要列表理解。