arr = np.array([Myclass(np.random.random(100)) for _ in range(10000)])
有没有办法通过直接创建对象的 numpy 数组来节省此语句中的时间(避免昂贵的列表构造)?
我需要创建和处理 Myclass 类的大量对象,其中每个对象包含几个 int、几个 float 和一个 float 列表(或元组)。使用(对象)数组的目的是利用 numpy 数组对对象数组(和其他内容)的切片的快速计算(例如,列和);采用切片的数组的每一行都由一个 Myclass 对象和其他标量字段)。除了使用 np.array (如上所述)之外,在这种情况下还有其他节省时间的策略吗?谢谢。
最佳答案
Numpy 需要提前知道数组的长度,因为它必须在 block 中分配足够的内存。
您可以使用np.empty(10_000, object)
从适当类型的空数组开始。 (请注意,对于大多数数据类型,空数组可能包含垃圾数据,通常从 np.zeros()
开始更安全,除非您确实需要性能,但 dtype 对象确实会正确初始化为 无
。)
然后,您可以使用np.vectorize
对所有值应用您喜欢的任何可调用对象(例如类)。如果可以的话,使用包含的向量化函数而不是转换它们会更快,因为 vectorize
基本上必须为 for 循环中的每个元素调用它。但有时你不能。
对于随机数,您可以使用np.random.rand()
创建任何您喜欢的形状的数组样本。但是,当您将类应用于它时,它仍然必须转换为新的 dtype 对象数组。我不确定这是否比在每个 __init__ (或任何可调用的)中创建示例更快。您必须对其进行概要分析。
关于python - 如何在不先构建列表的情况下创建对象的 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151916/