从Scipy矩阵创建列表

5
这是我的第一篇帖子,我仍然是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个回答

4

一个关于你的问题的问题

Sven和Navi已经回答了你如何转换的问题。

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

在转换成列表之前,我会在回答之前问一个问题:

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

使用数组代替矩阵

如果您查看Numpy for Matlab Users wiki/documentation页面,第3节讨论了'array' or 'matrix'? Which should I use?。简短的答案是应该使用数组。

使用数组的优点之一是:

您可以将秩-1数组视为行向量或列向量。dot(A,v)将v视为列向量,而dot(v,A)将v视为行向量。这可以节省您输入大量转置的时间。

另外,正如Numpy参考文档中所述,“矩阵对象始终是二维的。”这就是为什么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 属性转置矩阵 x
  2. 使用 .tolist() 将转置后的矩阵转换为嵌套列表
  3. 使用 [0] 获取嵌套列表的第一个元素

好的,谢谢,我明白你的意思了——使用数组确实会使代码更加简洁。回答你的问题:我选择矩阵而不是数组,是因为我想要进行一些简单的线性代数运算,并且我认为使用不太通用的类型会更容易处理。特别是,* 运算符可以进行正确的矩阵乘法,而不是元素逐个相乘(我知道我可以使用 multiply(),但我认为这样更方便)。 - dave85
使用矩阵进行线性代数更加方便,因为A*B是矩阵乘法。 - Matthew Rankin

0

怎么样?

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

或者

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

好的,很棒,看起来可以了,谢谢。我注意到如果我用 flatten() 替换 ravel(),它也会给我相同的结果... - dave85

0

是的,如果我执行scipy.array(x).flatten().tolist(),它会给我想要的列表;谢谢。 - dave85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接