首页 > 解决方案 > 如何创建和访问一个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

这样做的最佳方法是什么?

标签: pythonarraysnumpy

解决方案


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]是该观点的一个要素。这通常与原始缓冲区在同一个缓冲区中,但根据内存布局和您使用的索引类型,这两种方法可能会产生令人惊讶的不同结果。


推荐阅读