【问题标题】:Creating a matrix of objects in python在python中创建对象矩阵
【发布时间】:2018-11-07 14:52:16
【问题描述】:

我需要在 python 中创建一个对象矩阵。我找到了各种语言的其他解决方案,但是在 python 中找不到可靠且有效的方法。

给定班级

class Cell():
    def __init__(self):
        self.value = none 
        self.attribute1 = False
        self.attribute2 = False

我想尽可能高效地制作一个由多个“单元格”组成的矩阵。由于矩阵的大小将大于 20 x 20,因此迭代方法将很有用。任何贡献都有帮助

【问题讨论】:

标签: python oop object matrix


【解决方案1】:

如果您已经定义了对象,列表推导可以在这里提供帮助:

num_rows = 5
num_cols = 6

row = [Cell() for i in range(num_cols)]
# The original way doesn't behave exactly right, this avoids 
# deep nesting of the array. Also adding list(row) to create
# a new object rather than carrying references to row to all rows
mat = [list(row) for i in range(num_rows)]

#[[Cell(), Cell(), Cell()...], [...], ..., [Cell(), ..., Cell()]]

如果您愿意,也可以将它们包装在 numpy.array

NumPy 数组已满

您还可以使用内置的 numPy full 方法,并通过 m 填充您的值的 numpy 数组生成 n

mat = numpy.full((num_rows, num_cols), Cell())

文档可以在here找到

【讨论】:

  • 谢谢,这正是我想要的
  • @OscarWilson 让您知道。在这个矩阵中,整行都是相同的,这意味着修改一行会影响所有行,所以如果你不想要这样的东西,要么放 list(row) 或其他东西,因为这里发生的事情称为浅拷贝
  • 我对这个答案有点困惑。你不想一行有 6 个单元格(即列数)吗?所以不应该是这样吗? row = [Cell() for i in range(num_cols)]mat = [list(row) for i in range(num_rows)]
【解决方案2】:

如果您事先知道矩阵的大小,您可以使用 np.emptynp.zeros 初始化一个 numpy 数组,然后使用索引填充单元格。

或者您可以将项目附加到列表中,然后通过np.array(list) 转换为数组。 您需要将矩阵作为一个 numpy 数组来进行任何计算。

【讨论】:

    【解决方案3】:

    也许只是使用嵌套列表?

    类似:

    mtx = [[0, 1, 2], [3, 4, 5]]
    mtx[1][1] # 4
    

    编辑: 您可以使用 append 方法将元素添加到列表中。

    the_list = []
    for item in iterator_or_something:
        the_list.append(Cell(item.a, item,b))
    

    如果它是固定大小并且你知道:

    the_list = []
    for x in range(0, 500):
        the_list.append(Cell())
    

    【讨论】:

    • 我了解如何使用嵌套列表,但主要问题是创建对象列表。
    • 对象列表是什么意思? object_list = [Cell(), Cell(), Cell()]
    • 是的,就像那样,但是矩阵的大小可能比三个元素大一点。迭代方法会很有用。我将更新问题以澄清这一点
    • 使用追加可能是一种选择?
    【解决方案4】:
    Size = 20
    Matrix = np.zeros((Size, Size))
    
    for x in range(0, Size):
        for y in range(0, Size):
            Matrix[x][y] = Cell()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2022-08-17
      • 2012-11-01
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多