lev*_*eer 3 python arrays numpy class list
我理解为什么“标准”类型的 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)
Run Code Online (Sandbox Code Playgroud)
我可以用做的很好
self.myFoos = []
Run Code Online (Sandbox Code Playgroud)
做出这个决定时我应该记住什么?
Foo 类的复杂性有很大区别吗?(在我的用例中,它可能包含 20 或 30 个标准类型、一两个固定大小的整数数组,然后是大约 10 个简单方法。)
myFoos 中的 Foos 数量通常会产生影响吗?(在我的用例中,它将是 0 到 10)
myFoos 被处理的次数有影响吗?(在我的实际用例中,在用户操作之间可能会调用 10 到 20 次。)
Ps 虽然代码工作正常,但 pyCharm 不喜欢最后一个附加语句,它警告我
Expected type 'Union[ndarray, iterable]' got 'Foo' instead.
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我之前已经讨论过制作自定义对象数组 - 我会尝试查找一个好的讨论。
但是,首先要注意几点
np.zeros(0, dtype = Foo)
Run Code Online (Sandbox Code Playgroud)
真的是np.zeros(0, dtype=object)。有标准的 dtypes,还有object. 它保存指向内存中其他位置的对象的指针。与列表一样,这些可以是任何东西 - 数字、字符串、列表、数组Foo()、、None等。并且可以更改。
保持距离np.append。它不是列表附加的良好替代品。如果您必须使用其他数组创建一个新数组,请学习使用concatenate(包括正确获取维度)。
self.myFoos = np.append(self.myFoos, some_foo)
Run Code Online (Sandbox Code Playgroud)
对象 dtype 列表与列表基本相同,只是它们可以重塑为 2d,并且不能随append. 对象数据类型数组上的许多操作都是通过列表推导式执行的。
我回答了这张海报(大约在同一时间范围内搜索)中尝试使用自定义类数组的几个问题。仅访问此类对象的属性就需要列表理解。
| 归档时间: |
|
| 查看次数: |
3845 次 |
| 最近记录: |