Python迭代矩阵类

Posted

技术标签:

【中文标题】Python迭代矩阵类【英文标题】:Python iterating over matrix class 【发布时间】:2017-01-30 07:33:08 【问题描述】:
from collections.abc import Sequence

class Map(Sequence):
    """ Represents a map for a floor as a matrix """

    def __init__(self, matrix):
        """ Takes a map as a matrix """
        self.matrix = matrix
        self.height = len(matrix)
        self.width = len(matrix[0])
        super().__init__()

    def __getitem__(self, item):
        """ Needed by Sequence """
        return self.matrix[item]

    def __len__(self):
        """ Needed by Sequence """
        return len(self.matrix)

    def search(self, entity):
        """ Returns a generator of tuples that contain the x and y for every element in the map that matches 'entity' """
        for row in range(self.height):
            for column in range(self.width):
                if matrix[row][column] == entity:
                    yield (row, column)


# Examples

gmap = Map([[0, 0, 0],
           [0, 1, 0],
           [0, 0, 0]])

for entity in gmap:
    print(entity)

我怎样才能实现__iter__ 这样

for entity in gmap:
    print(entity)

产生0 0 0 0 1 0 0 0 0 而不是

[0, 0, 0]
[0, 1, 0]
[0, 0, 0]

这将使我无需继承 Sequence,并使 search() 的代码更整洁

此外,我应该使用他们的任何其他魔术方法吗? (除了__str__,我在迭代工作后会这样做)

【问题讨论】:

这真是个坏主意。这会使您的__iter____getitem__ 彼此不一致。 另外,它实际上不会让search 更整洁。 【参考方案1】:

你可以像这样实现__iter__()

from itertools import chain

def __iter__(self):
    return chain.from_iterable(self.matrix)

itertools.chain.from_iterable() 接受一个可迭代的迭代并将它们组合在一起。它创建了一个生成器,因此不会使用额外的内存。

【讨论】:

谢谢!我实际上尝试过这个,但我才意识到我搞砸了如何导入它 @Lord_Zane55 顺便说一句,矩阵不一定是“行序列”...__getitem__ 返回一行相当有趣。这不是很直观。 我发现sn-p在线进行迭代,你能解释一下矩阵不是“行序列”以及__getitem__应该做什么以备将来使用吗? @Bharel: __getitem__ 返回一行是非常普通的。否则你会让some_matrix[2][3] 工作吗? 我的意思是,矩阵根本不是一个序列。矩阵的长度是多少?行数?你不觉得 1 行 9001 列的矩阵的 length 为 1 很有趣吗?它有宽度和高度,而不是长度......确实,需要__getitem__Sequence的继承让我好奇。您可能会争辩说,因此长度是width * height,但是__getitem__ 与长度结合起来毫无意义。尝试获取第 9001 项(毕竟这是长度)会失败。

以上是关于Python迭代矩阵类的主要内容,如果未能解决你的问题,请参考以下文章

所有迭代后的 Python 保存矩阵

OpenCV 矩阵运算是不是比简单的循环迭代更快?

Python:如何在不扩展矩阵的情况下增加矩阵的维度?

将循环迭代的矩阵保存在一个矩阵中

python进阶练习之——矩阵相加❤️

迭代法的迭代矩阵