如何在 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/901925tolist()
所示,在二维数组(例如矩阵)上会生成一个嵌套列表。我假设这就是您所说的“典型 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 矩阵创建列表的主要内容,如果未能解决你的问题,请参考以下文章