如何在Python中从Numpy矩阵创建列表

42

我使用numpy的dot()函数,将一个3x3的矩阵与一个1x3的numpy.array相乘。输出例如为:

[[ 0.16666667 0.66666667 0.16666667]]

它的类型是:

<class 'numpy.matrixlib.defmatrix.matrix'>

我该如何将这个矩阵转换为列表。因为我知道结果始终是一个1x3的矩阵,所以应该将其转换为一个列表,因为我稍后需要循环遍历它以计算两个列表之间的Pearson距离。

总结一下:我该如何从这个矩阵创建一个列表?

10个回答

46

可能不是最优的方法,但以下代码可以实现:

a = numpy.matrix([[ 0.16666667, 0.66666667, 0.16666667]])
list(numpy.array(a).reshape(-1,))
或者
numpy.array(a).reshape(-1,).tolist()
或者
numpy.array(a)[0].tolist()

15

在矩阵对象上使用tolist()方法:

>>> import numpy
>>> m = numpy.matrix([1, 2, 3])
>>> type(m)
<class 'numpy.core.defmatrix.matrix'>
>>> m.tolist()
[[1, 2, 3]]

问题是整个矩阵变成了一个只有1个元素的列表,如:[[0.16666666666666666,0.6666666666666666,0.16666666666666666]]。我需要每个值都成为长度为3的新列表中的元素。我该怎么做? - Javaaaa
和其他评论所说的一样:numpy.array(a).reshape(-1,).tolist() 或者使用 ravel()。 - tito

15

如果a是你的矩阵,尝试以下代码

a.ravel().tolist()

但是您不需要将其转换为列表来进行迭代。


我知道我不需要迭代它,但是整个类都是为了处理列表而编写的,因此如果我将其制作成列表,那么更容易而不是更改整个类。然而,使用您的解决方案,我也得到了一个包含矩阵的1个元素的列表,而不是包含3个元素的列表。有什么想法如何做到后者吗? - Javaaaa
1
@Javaaaa:你得到了一个只有一个列表项的列表。直接使用[0]来检索该单个项即可。 - Sven Marnach
ravel()是多余的:b.tolist() == b.ravel().tolist() >>> True - Martin
2
@Martin:不,只有在你的矩阵本来就只有一行的情况下才是多余的。 - Sven Marnach

10

另一种方法:

>>> import numpy as np
>>> m = np.matrix([1,2,3])
>>> np.array(m).flatten().tolist()
[1,2,3]

2
为什么不简单呢?
list(a.flat)

例如:
>>> import numpy as np
>>> a = np.matrix([[ 0.16666667, 0.66666667, 0.16666667]])
>>> a
matrix([[ 0.16666667,  0.66666667,  0.16666667]])
>>> a.flat
<numpy.flatiter object at 0x0000000002DE8CC0>
>>> a.flat.tolist()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.flatiter' object has no attribute 'tolist'
>>> list(a.flat)
[0.16666666999999999, 0.66666667000000002, 0.16666666999999999]

1
m = numpy.matrix([[ 0.16666667, 0.66666667, 0.16666667]])
a = numpy.array(m)[0]

for i in a:
    print i

结果是

0.16666667
0.66666667
0.16666667

1
尝试这种简单的方法。它适用于1D数组,不知道是否适用于更高维度。
import mumpy as np         # to create a numpy array example
a = np.array([1,2.5,3])    # your 1D numpy array
b = [i for i in a]        # your list out of the original numpy array

1

0
import numpy as np
a = np.matrix([[1,2,3,4]])
b = map(float, a.transpose())

这段代码片段将应用内置函数“float” - 将某些内容转换为浮点数 - 到a的每个元素。由于a的第一个元素本身就是一个数组,因此必须对其进行转置,以便每个数字成为a本身的一个元素。在此示例中,a.transpose()等同于np.matrix([[1],[2],[3],[4]])。

3
请尽量用简短的语言解释您的答案,即使您的代码已经运行成功。 - niyasc

0

我来这里是为了寻找一种将numpy矩阵转换为典型的二维列表的方法。

对于一个numpy矩阵m:

my_2d_list = map(list, list(m.A))

如果您只想从一个1 x n矩阵m中获取一维列表:
my_1d_list = list(list(m.A)[0])

如https://dev59.com/O2435IYBdhLWcg3w1j2V#5183572所示,对于二维数组(例如矩阵),`tolist()`会生成一个嵌套列表。我认为这就是您所谓的“典型的二维列表”。 - hpaulj

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