【问题标题】:Lists in Python vs vectors and matrices in MatlabPython中的列表与Matlab中的向量和矩阵
【发布时间】:2017-05-03 07:55:15
【问题描述】:

来自 Matlab,我什至无法想到奇异的数据点/变量。我处理的任何东西都是矩阵/数组。经过一周的搜索和不成功的试验和错误,我意识到,我绝对不明白在(普通)Python 中处理矩阵的概念。

我创造了

In[]: A = [[1,2,3], [9,8,7], [5,5,5]]
In[]: A
Out[]: [[1, 2, 3], [9, 8, 7], [5, 5, 5]]

尝试沿二维提取矩阵中的向量:

In[]: A[:][1]
Out[]: [9, 8, 7]
In[]: A[1][:]
Out[]: [9, 8, 7]

“令人惊讶”给出了相同的结果!没有办法获得特定的列(当然,除了逐个迭代)。

因此,我无法管理将矩阵 A 与另一个向量合并,即用另一列扩展 A。 Matlab 风格的方法显然很奇怪:

In[]: B = A, [4,6,8]
In[]: B
Out[]: ([[1, 2, 3], [9, 8, 7], [5, 5, 5]], [4, 6, 8])

结果是嵌套的,而不是 A 的扩展。

也一样
B = [A, [4,6,8]]

好的,更像 Python:

A.append([11,12,13])

这很容易添加一行。但是有没有类似的方法加一列??

(令人沮丧的是,Python 文档提供了各种花哨的示例,但显然这些示例侧重于演示一维列表的“pythonic”解决方案。)

【问题讨论】:

  • Raw Python 在设计时并未考虑到矩阵代数。您应该调查 numpy 库。
  • 好吧,你不能只是随机地将 matlab 矩阵中的概念扔到 python 列表中,它们是完全不同的数据结构。这个问题需要比我们提供的更多的帮助,因为您需要阅读 Python 教程。你说你确实调查过了,但显然你不知道发生了什么。所以再读一遍,放弃之前的matlab知识。当您在切片或索引方面遇到特定(!)问题时,请回来询问。除此之外,如果您想要类似 matlab 的行为,请使用 numpy 数组和矩阵,而不是 Python 列表。
  • 第一步,将 Python 列表视为对象序列。它没有任何用于添加“列”的内置方法,因为“列”的概念不适用于列表。当您有一个列表列表时,这些列仅在您的脑海中。对于 python,它是列表对象的一维序列。列表并非旨在执行常见的矩阵运算。

标签: python matlab matrix


【解决方案1】:

我本人来自 MATLAB,我理解您的观点。 问题在于 Python 列表并非旨在用作矩阵。索引列表时,您总是在顶级列表元素上工作,例如A[:][1] 返回所有([:])三个列表元素,即[1, 2, 3][9, 8, 7][5, 5, 5]。然后从这些元素中选择第二个([1])元素,即[9, 8, 7]A[1][:] 也一样,只是反过来。

话虽如此,您仍然可以将nested lists 用于简单的索引任务,因为A[1][1] 给出了预期的结果(8)。但是,如果您打算将整个 MATLAB 代码迁移到 Python 或处理非平凡的矩阵问题,那么您绝对应该考虑使用 NumPy。甚至还有NumPy guide for former MATLAB users

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2018-07-07
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多