【问题标题】:Numpy matrix to arrayNumpy矩阵到数组
【发布时间】:2011-03-21 05:17:23
【问题描述】:

我正在使用 numpy.我有一个 1 列 N 行的矩阵,我想从 N 个元素中获取一个数组。

例如,如果我有M = matrix([[1], [2], [3], [4]]),我想获得A = array([1,2,3,4])

为了实现它,我使用A = np.array(M.T)[0]。有谁知道获得相同结果的更优雅的方法?

谢谢!

【问题讨论】:

标签: python arrays matrix numpy


【解决方案1】:

如果你想要一些更易读的东西,你可以这样做:

A = np.squeeze(np.asarray(M))

同样地,您也可以这样做:A = np.asarray(M).reshape(-1),但这不太容易阅读。

【讨论】:

  • 对我来说有点咆哮......为什么 numpy 将数组和矩阵作为单独的实体。恕我直言,这太不合情理了。感谢@Joe 的提示。
  • @Naijaba - 就其价值而言,矩阵类已有效(但未正式)折旧。它主要用于历史目的。删除 numpy.matrix 是一个有争议的问题,但 numpy 开发人员非常同意你的观点,即两者兼有是不合 Python 的,而且出于各种原因很烦人。然而,大量使用 matrix 的旧的、未维护的“野外”代码使其难以完全删除。
  • 更不用说,真正的矩阵乘法只是在 Numpy 1.10 中为数组添加,并且基本上仍处于测试阶段。这意味着很多人(包括我自己)仍然必须使用矩阵而不是数组来完成我们想做的事情。 docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
  • 稀疏矩阵是内存高效机器学习的基础(例如,sklearn)。事实上,scipy 中有不同的sparse matrix 类型,它们允许通过行或列进行有效访问。我想这可能是合并矩阵和数组概念的问题。也就是说,我想知道是否也可以引入 sparse array 类型以及是否有任何计划这样做。有什么线索吗?
  • 我认为 .flatten() 和 .squeeze() 一样有效,只要你最终想要一个一维数组。
【解决方案2】:

或者你可以试着避免一些临时工

A = M.view(np.ndarray)
A.shape = -1

【讨论】:

    【解决方案3】:
    A, = np.array(M.T)
    

    这取决于我想你所说的优雅是什么意思,但这就是我会做的

    【讨论】:

      【解决方案4】:

      您可以尝试以下变体:

      result=np.array(M).flatten()
      

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 我认为这个答案比公认的答案,性能方面和简单性要好
        • M.A1 很棒,与“ravel”和“flatten”的实现相同,在这种情况下不会导致任何数据副本 A 因此仍然链接到 M 如果 A 和/或可能会导致意外M 是可变的。 M.flat 真正的替代返回“flatiter”生成器(只读语义) np.squeeze(M) # 给出一个删除尺寸为 1 的视图,这里也可以,但不保证对于一般 M np.reshape( M,-1) # 通常是一个取决于形状兼容性的视图,这个“-1”是做A1/ravel/flatten的迂回方式
        【解决方案6】:
        np.array(M).ravel()
        

        如果您关心速度;但如果你关心记忆:

        np.asarray(M).ravel()
        

        【讨论】:

        • 如果你解释了原因会提高你的回答质量
        【解决方案7】:

        首先,Mv = numpy.asarray(M.T),它为您提供了一个 4x1 的二维数组。

        然后,执行A = Mv[0,:],它会给你你想要的。你可以把它们放在一起,就像numpy.asarray(M.T)[0,:]

        【讨论】:

          【解决方案8】:

          这会将矩阵转换为数组

          A = np.ravel(M).T
          

          【讨论】:

            【解决方案9】:

            ravel()flatten() 来自 numpy 的函数是我会在这里尝试的两种技术。我想补充JoeSirajbubbleKevad 的帖子。

            拉威尔:

            A = M.ravel()
            print A, A.shape
            >>> [1 2 3 4] (4,)
            

            展平:

            M = np.array([[1], [2], [3], [4]])
            A = M.flatten()
            print A, A.shape
            >>> [1 2 3 4] (4,)
            

            numpy.ravel() 更快,因为它是一个库级函数,不会复制数组。但是,如果您使用 numpy.ravel(),则数组 A 中的任何更改都会将其自身转移到原始数组 M 中

            numpy.flatten()numpy.ravel()。但是如果您使用numpy.flatten() 创建A,那么A 中的更改将不会转移到原始数组M

            numpy.squeeze()M.reshape(-1)numpy.flatten()numpy.ravel() 慢。

            %timeit M.ravel()
            >>> 1000000 loops, best of 3: 309 ns per loop
            
            %timeit M.flatten()
            >>> 1000000 loops, best of 3: 650 ns per loop
            
            %timeit M.reshape(-1)
            >>> 1000000 loops, best of 3: 755 ns per loop
            
            %timeit np.squeeze(M)
            >>> 1000000 loops, best of 3: 886 ns per loop
            

            【讨论】:

              【解决方案10】:

              来晚了,希望对大家有所帮助,

              np.array(M.flat)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-05-28
                • 2015-02-04
                • 1970-01-01
                • 2021-10-25
                • 2013-11-26
                • 1970-01-01
                • 2020-10-25
                相关资源
                最近更新 更多