python - 如何在不先构建列表的情况下创建对象的 numpy 数组?

标签 python arrays numpy

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/

相关文章:

python - 从源代码安装 mod_wsgi 时出错

python - BeautifulSoup.select方法

python - 使用 numpy 获取多维数组的所有对角线(包括次要对角线)

python - 如何将向量添加到矩阵

python - pandas 系列从十六进制转换为 ascii 时出现错误

python - 如何使用 WMS 层在 django-leaflet-admin 中设置传单配置

java - 确定用户输入的字符串格式是否正确

javascript - this .join(this) 在 javascript 中如何工作?

c# - 将 JSON 数组发布到 mvc Controller

python - 嵌套 numpy 运算