来自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 doc提供了各种奇特的例子,但显然这些都集中在为一维列表演示'pythonic'解决方案。)
答案 0 :(得分:6)
我自己来自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。