python - 如何创建和访问一个numpy对象数组?
问题描述
我认为我的代码将解释我正在尝试做的事情:
class Book():
def __init__(self, Author, Pages):
self.Author = Author
self.Pages = Pages
def getAuthor(self):
return self.Author
book_1 = Book("Jane Smith", 20)
book_2 = Book("Billy", 20)
B = np.array([book_1, book_2])
print(B[0][1].getAuthor())
基本上,我想打印“Billy”,我得到的错误是:
TypeError: 'Book' object is not subscriptable
这样做的最佳方法是什么?
解决方案
Numpy(与 MATLAB 不同)不会向您不告诉它的数组添加维度。因此,B = np.array([book_1, book_2])
创建一个 shape 数组(2,)
,而不是(2, 1)
or (1, 2)
。您可以通过打印来验证这一点B.shape
。
要访问第二个元素,您只需执行B[1]
.
当你这样做时B[0][1]
,你正在访问第一个元素,然后用 索引它[1]
,就像你这样做一样book_1[1]
。该错误告诉您这是非法的,因为您没有__getitem__
在课堂上实现。
笔记:
您通常不想将 numpy 用于对象数组。
list
在附加元素方面,它们没有任何优势,但也有一些劣势。索引多维 numpy 数组是通过单个索引完成的(与列表不同,列表一次只支持一个维度)。所以如果
B
真的是 2D,你会做B[0, 1]
. 虽然你可以做到B[0][1]
,但它实际上做的事情与B[0, 1]
.B[0]
是数组第一行的视图。B[0][1]
是该观点的一个要素。这通常与原始缓冲区在同一个缓冲区中,但根据内存布局和您使用的索引类型,这两种方法可能会产生令人惊讶的不同结果。
推荐阅读
- amazon-web-services - 每天更新云中 2-30 亿行数据集中的 1 亿行
- java - 实现类导致“重复类错误
- junit - jMockit 代码覆盖工具:如何在 Eclipse 运行配置中激活?
- python - 关于为什么列表列表的处理失败的问题
- javascript - Array.fill 函数在反应中不起作用
- javascript - 删除 EventListener 上的转换:
- markdown - 构造一个包含许多节和小节的 Markdown 文件
- material-ui - material-ui 创建许多重复的类
- curl - 带有用户名/密码身份验证的 curl 失败
- c# - 异步任务中的 ASP.NET EF Core 连接问题