【问题标题】:How to make List from Numpy Matrix in Python如何在 Python 中从 Numpy 矩阵创建列表
【发布时间】: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 距离。

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

【问题讨论】:

    标签: python list matrix numpy


    【解决方案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])
          

          【讨论】:

          • stackoverflow.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()
                猜你喜欢
                • 2016-07-29
                • 2016-05-27
                • 2013-08-28
                • 2014-08-06
                • 1970-01-01
                • 2016-05-22
                • 2014-06-20
                • 1970-01-01
                • 2016-11-20
                相关资源
                最近更新 更多