【问题标题】:Numpy arrays vs lists for custom classes用于自定义类的 Numpy 数组与列表
【发布时间】:2018-03-03 04:14:29
【问题描述】:

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

附:虽然代码运行良好,但 pyCharm 不喜欢最后的 append 语句,它警告我

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

提前致谢!

【问题讨论】:

  • dtype=Foo 并没有按照你的想法去做。
  • ...it is better to get into the habit of using numpy arrays for the simple stuff,..。除非我正在做一些非常适合 numpy 的计算,否则我通常从标准库容器开始,除非我遇到性能问题然后尝试找到更好的东西。

标签: python arrays list class numpy


【解决方案1】:

我之前讨论过制作自定义对象数组 - 我会尝试查找一个很好的讨论。

但是,首先要注意几点

np.zeros(0, dtype = Foo)

真的是np.zeros(0, dtype=object)。有标准的数据类型,还有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

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

【讨论】:

  • 非常感谢@hpaulj!对我来说,要点是: 1. 如果我不需要重塑为 2d(我不需要),那么我不会从使用对象类型数组而不是列表中获得任何优势。 2. 远离 np.append。学习串联。所以,没有将数组声明为特定的类类型 - 只是对象类型?
猜你喜欢
  • 2023-04-11
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2018-07-13
  • 2023-04-07
相关资源
最近更新 更多