这是我的第一篇文章,我仍然是 Python 和 Scipy 的新手,所以请放轻松!我正在尝试将 Nx1 矩阵转换为 python 列表。假设我有一些 3x1 矩阵
x = scipy.matrix([1,2,3]).transpose()
我的目标是从 x 创建一个列表 y 以便
y = [1, 2, 3]
我试过使用 tolist()
方法,但它返回 [[1], [2], [3]]
,这不是我追求的结果。我能做的最好的就是这个
y = [xi for xi in x.flat]
但这有点麻烦,我不确定是否有更简单的方法可以达到相同的结果。就像我说的,我仍然在掌握 Python 和 Scipy...
谢谢
最佳答案
你的问题的问题
虽然 Sven 和 Navi 已经回答了你关于如何转换的问题
x = scipy.matrix([1,2,3]).transpose()
进入列表,我会先问一个问题再回答:
- 为什么要使用 Nx1 矩阵而不是数组?
使用数组代替矩阵
如果您查看 Numpy for Matlab Users wiki/文档页面,第 3 部分讨论了 'array' or 'matrix'? Which should I use? .简短的回答是您应该使用数组。
使用数组的优点之一是:
You can treat rank-1 arrays as either row or column vectors. dot(A,v) treats v as a column vector, while dot(v,A) treats v as a row vector. This can save you having to type a lot of transposes.
此外,如 Numpy Reference Documentation 中所述, “矩阵对象总是二维的。”这就是 x.tolist()
为您返回一个嵌套的 [[1], [2], [3]]
列表的原因。
因为你想要一个 Nx1 对象,我建议使用数组如下:
>>> import scipy
>>> x = scipy.array([1,2,3])
>>> x
array([1, 2, 3])
>>> y = x.tolist() // That's it. A clean, succinct conversion to a list.
>>> y
[1, 2, 3]
如果你真的想用矩阵
如果出于某种原因你真的需要/想要使用矩阵而不是数组,我会这样做:
>>> import scipy
>>> x = scipy.matrix([1,2,3]).transpose()
>>> x
matrix([[1],
[2],
[3]])
>>> y = x.T.tolist()[0]
>>> y
[1, 2, 3]
换句话说,x.T.tolist()[0]
将:
- 使用
.T
属性转置 x 矩阵 - 使用
.tolist()
将转置矩阵转换为嵌套列表 - 使用
[0]
获取嵌套列表的第一个元素
关于python - 从 Scipy 矩阵创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690366/