从Scipy矩阵创建列表

时间:2011-01-14 11:05:26

标签: python numpy scipy

这是我的第一篇文章,我仍然是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 ......

由于

3 个答案:

答案 0 :(得分:3)

您的问题的问题

虽然Sven和Navi回答了关于如何转换的问题

x = scipy.matrix([1,2,3]).transpose()

进入列表,在回答之前我会问一个问题:

  • 为什么使用Nx1矩阵而不是数组?

使用数组而不是矩阵

如果你看一下Numpy for Matlab用户wiki /文档页面,第3节讨论了'array' or 'matrix'? Which should I use?。简短的回答是你应该使用数组。

使用数组的一个优点是:

  

您可以将rank-1数组视为行或列向量。 dot(A,v)将v视为列向量,而dot(v,A)将v视为行向量。这可以节省您输入很多转座的费用。

另外,正如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]将:

  1. 使用.T属性
  2. 转置x矩阵
  3. 使用.tolist()
  4. 将转置矩阵转换为嵌套列表
  5. 使用[0]
  6. 抓取列出的嵌套列表的第一个元素

答案 1 :(得分:0)

怎么样

x.ravel().tolist()[0]

scipy.array(x).ravel().tolist()

答案 2 :(得分:0)