【问题标题】:In Python is there any way to append behind?在Python中有什么办法可以追加吗?
【发布时间】:2015-07-13 03:36:30
【问题描述】:

我有一个矩阵:

[[1 2 3],
[4 5 6], 
[7 8 9]]  

我需要创建一个新矩阵:

[[7 4 1],
[8 5 2],
[9 6 3]]

我试过了

new_matrix = [[1]]
new_matrix.append(matrix[1][0])

得到了 new_matrix = [4 1] 而不是 new_matrix = [1 4]

如果您需要更多说明,请尽管询问。

【问题讨论】:

  • 追加在后面,前置在前面。
  • 这是一个 numpy 数组吗?
  • numpy 数组没有 append 方法,所以我假设它没有。
  • @cge,python 列表元素之间有逗号
  • 虽然确实如此,但我看到很多情况下人们不会提出问题,尤其是当他们来自其他语言时。老实说,这不是很清楚。

标签: python matrix append behind


【解决方案1】:

是的。使用new_matrix.insert(0,matrix[1][0])

insert(position,value) 允许您将对象插入到列表中的指定位置。在这种情况下,由于要在开头插入数字,因此位置为零。

但是请注意,如果 new_matrix 有 n 个元素,这需要 O(n) 时间。如果 new_matrix 有 100 个元素,那么在开头添加一些东西比它有 10 个元素要长十倍。这比在列表末尾添加一些东西要慢得多,这通常需要 O(1):无论如何它都应该很快new_matrix 有多大。有关 python 操作的时间复杂度的更多信息,请参阅here。如果您经常将元素添加到列表的开头,您可能需要考虑是否可以反转您正在做的事情。

另外,请注意你做事的方式,这会给你一个 [4,[1]] 的 new_matrix。我不太确定你想要什么:如果你想要描述它们的最终结果,那么你需要new_matrix = [1]。如果您的代码是正确的 (new_matrix = [[1]]),并且您想要 [[4,1]],那么您需要执行 new_matrix[0].insert(0,4)。如果你想要[[4],[1]],你需要new_matrix.insert(0,[4]),等等。

顺便说一句,既然你似乎在用矩阵做事,你有没有考虑过使用 numpy?


(我想指出,如果这个答案看起来有点离题,那是因为这个问题被编辑成与最初提出的完全不同的东西。)

至于新问题:虽然 Stefan 的回答是好的 python,但你可能给自己太多的工作。很明显,您正在尝试实现类似矩阵转置的东西,但镜像除外。如果您正在执行这些操作,Numpy更加更轻松、更快捷。在这种情况下,使用 numpy 数组,您只需要执行以下操作:

import numpy as np # import numpy
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Here's your matrix
new_matrix_1 = matrix[::-1,:] # Here's your matrix with all the rows reversed: [[7,8,9],[4,5,6],[1,2,3]]
new_matrix = new_matrix_1.T # Here's the transpose of that, which is what you want.

虽然这只是一件事,但它会让一切你做的更轻松。例如,算术实际上会起作用:new_matrix+matrix2*new_matrix 等等。否则,您必须手动实现。

【讨论】:

  • 或者:new_matrix = [1] + matrix[1][0]
【解决方案2】:

既然可以一次完成,为什么还要以微小的步骤构建矩阵?

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> new_matrix = zip(*matrix[::-1])
>>> new_matrix
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]

或者,如果您确实需要将行作为列表:

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> new_matrix = map(list, zip(*matrix[::-1]))
>>> new_matrix
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]

解释:

  • 首先[::-1] 反转矩阵,即将它颠倒过来。这让我们离想要的结果更近了一步。
  • zip 然后通过组合行来转置矩阵。 zip结果的第一个元素是每行第一个元素的列表,即zip的第一个元素是第一个。依此类推,即 zip 为您提供列列表,即转置矩阵。

【讨论】:

  • 我认为解释你为什么反转矩阵,以及如何使用 zip 来转置在这里会有所帮助。 Zip 功能强大,用途广泛,但我相信如果没有视觉辅助,一开始很难理解。
  • reversed(matrix) 会更高效
  • @PadraicCunningham 不,不是。我刚刚尝试过,timeit 运行了一百万次。 [::-1] 需要 5.39 秒,reversed 需要 7.68 秒。
  • @StefanPochmann,所以你是在告诉我创建一个全新的数组更快,内存效率更高?
  • @PadraicCunningham 它可能需要更多内存,但是是的,在这个用例中它明显更快,所以说它的效率较低是错误的。
【解决方案3】:

发件人:

[[1 2 3],
[4 5 6], 
[7 8 9]] 

[[7 4 1],
[8 5 2],
[9 6 3]]

可以这样做

import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix[::-1].T

【讨论】:

    【解决方案4】:

    如果你喜欢列表推导和其他东西:

    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    result = [ [ i[k] for i in matrix[::-1] ] for k in range(len(matrix)) ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2010-11-15
      • 2019-02-04
      相关资源
      最近更新 更多