从Scipy矩阵创建列表

5 投票
3 回答
1798 浏览
提问于 2025-04-16 09:57

这是我第一次发帖,我还是个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

这样怎么样

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

或者

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

我觉得你快成功了,可以试试使用 flatten 函数。这个函数的详细信息可以在这里找到:http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html

4

你提问之前的一个问题

Sven和Navi已经回答了你关于如何将

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

转换成列表的问题,但我在回答之前想问你一个问题:

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

使用数组而不是矩阵

如果你查看Numpy为Matlab用户准备的维基/文档页面,第三部分讨论了'数组'还是'矩阵'? 我该用哪个?。简单来说,你应该使用数组。

使用数组的一个好处是:

你可以把一维数组当作行向量或列向量来使用。比如,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]获取嵌套列表的第一个元素

撰写回答