【问题标题】:Python OOP __Add__ matrices together (Looping Problem)Python OOP __Add__ 矩阵在一起(循环问题)
【发布时间】:2011-03-16 16:47:28
【问题描述】:
class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        for k in range(len(self.data[0])):
            data.append([self.data[k] + other.data[k]])
        data.append([self.data[j] + other.data[j]])
        data = []

    return Matrix(data)  

x = Matrix([[1,2,3],[2,3,4]])
y = Matrix([[10,10,10],[10,10,10]])
print(x + y,x + x + y)

我能够让矩阵添加 1 行 x n 列,但是当我尝试通过添加第二个循环来改进所有 n x n 矩阵时,我得到了这个错误。

Traceback (most recent call last):

  line 24, in <module>
    print(x + y,x + x + y)

  line 15, in __add__
    data.append([self.data[k] + other.data[k]])

IndexError: list index out of range

【问题讨论】:

  • 你考虑过使用numpy.matrix吗?
  • @StephenPaulger:我不认为推荐一个关于numpy 的python 新手是个好主意。 numpy 确实很棒,但是如果您仍然掌握基本的 Python 概念,使用它是 IMO 灾难的秘诀。
  • 我明白你的意思,但 Python 的真正优势之一是大多数事情已经由某人完成并且它们很容易重用。任何了解矩阵乘法的人都应该能够弄清楚如何安装和使用 numpy。 :)

标签: python oop class matrix addition


【解决方案1】:

这个怎么样:

class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        data.append([])
        for k in range(len(self.data[0])):
            data[j].append(self.data[j][k] + other.data[j][k])

    return Matrix(data)

【讨论】:

    【解决方案2】:

    你的代码有几个问题……首先是加法算法的基本逻辑

    data.append([self.data[k] + other.data[k]])
    

    这个说法很可疑...数据是一个二维矩阵,但在这里您使用单个索引访问它。因此,data[k] 是一整行,使用 + 您正在连接行(可能不是您想要的,对吗?)。可能highBandWidth 的解决方案就是您要找的。​​p>

    第二个问题比较微妙,和语句有关

    self.data = data
    

    可能是一个问题,因为 Python 使用了所谓的“引用语义”。您的矩阵将使用传递的 data 参数作为内容但不复制它。它将存储对您传递给构造函数的同一 data 列表对象的引用。 可能这是故意的,但可能不是……这还不清楚。如果您从相同的数据构建两个矩阵,然后在第一个中更改单个元素的内容并且第二个更改的内容对您来说可以吗?如果不是这种情况,那么您应该复制 data 的元素,而不仅仅是分配 data 成员,例如使用

    self.data = [row[:] for row in data]
    

    或使用standard copy module 中的copy.deepcopy

    第三个问题是您只使用了两个空格进行缩进。这不聪明...在 python 中工作时,您应该使用 4 个空格缩进并且永远不要使用硬制表符。请注意,我说这样做(使用两个空格)并不聪明,并不是说你不聪明,所以请不要个人认为(我什至在从 python 开始时自己也犯了同样愚蠢的错误)。如果你真的想与众不同,那么可以通过在 python 中编写令人惊叹的无错误软件来实现这一点,而不仅仅是使用错误的缩进或为函数或变量选择错误的名称。专注于更高层次的美。

    最后一个问题是(一旦你真正理解了为什么你的代码不能工作)你应该真正阅读 python 列表推导,如果使用得当,这个工具可以大大简化你的代码。例如,您添加的代码可能会变成

    return Matrix([[a + b for a, b in zip(my_row, other_row)]
                   for my_row, other_row in zip(self.data, other.data)])
    

    对于受过训练的人来说,这比您的原始代码更容易阅读(而且速度也更快)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多