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

Posted

技术标签:

【中文标题】如何在 Python 中从 Numpy 矩阵创建列表【英文标题】:How to make List from Numpy Matrix in Python 【发布时间】:2011-07-08 04:47:06 【问题描述】:

我使用 numpy 中的 dot() 函数将 3x3 的矩阵与 1x3 的 numpy.array 相乘。输出例如是这样的:

[[ 0.16666667 0.66666667 0.16666667]]

类型:

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

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

总结一下:如何从这个矩阵中列出一个列表?

【问题讨论】:

【参考方案1】:

我认为getA1() 可以胜任。 来自文档:

getA1()

将 self 作为扁平的 ndarray 返回。

等价于 np.asarray(x).ravel()

来自https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.getA1.html

【讨论】:

【参考方案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]

【讨论】:

【参考方案3】:
import numpy as np
a = np.matrix([[1,2,3,4]])
b = map(float, a.transpose())

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

【讨论】:

请尽量用几句话解释您的答案,即使您的代码正在运行【参考方案4】:

试试这个简单的方法。它适用于一维数组,不知道更高维度。

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

【讨论】:

【参考方案5】:

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

对于一个 numpy 矩阵 m:

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

如果你只想要一个 1 x n 矩阵 m 的一维列表:

my_1d_list = list(list(m.A)[0])

【讨论】:

如***.com/a/5183572/901925 tolist() 所示,在二维数组(例如矩阵)上会生成一个嵌套列表。我假设这就是您所说的“典型 2D 列表”。【参考方案6】:

可能不是执行此操作的最佳方式,但以下工作:

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()

【讨论】:

【参考方案7】:

另一种方式:

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

【讨论】:

【参考方案8】:
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

【讨论】:

【参考方案9】:

如果a 是您的矩阵,请尝试

a.ravel().tolist()

但是你不需要把它变成一个列表来迭代它。

【讨论】:

我知道我不需要它来迭代它,但是编写了一个完整的类来处理列表,所以如果我列出它然后更改整个类会更容易。但是,通过您的解决方案,我也得到了一个包含 1 个元素的列表,它是矩阵,而不是一个包含 3 个元素的列表。我怎样才能使后者?有什么想法吗? @Javaaaa:你得到一个列表,其中包含一个列表本身。只需使用[0] 即可检索该单个项目。 ravel() 是多余的:b.tolist() == b.ravel().tolist() >>> True @Martin:不,如果您的矩阵首先只有一行,这只是多余的。【参考方案10】:

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

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

【讨论】:

问题是整个矩阵然后变成了一个包含 1 个元素的列表的 1 个元素。喜欢:[[0.16666666666666666,0.6666666666666666,0.16666666666666666]]。我需要每个值都是长度为 3 的新列表的元素。我该怎么做? 和其他cmets说的一样:numpy.array(a).reshape(-1,).tolist()或者使用ravel()

以上是关于如何在 Python 中从 Numpy 矩阵创建列表的主要内容,如果未能解决你的问题,请参考以下文章

python如何输入矩阵

python Numpy库相关矩阵运算

在 numpy 中从具有索引的 2D 矩阵构建 3D 布尔矩阵

如何在python numpy中创建随机正交矩阵

如何使用 numpy 从一维数组创建对角矩阵?

如何在 NumPy 中创建一个空数组/矩阵?