【问题标题】:numpy np.array versus np.matrix (performance)numpy np.array 与 np.matrix (性能)
【发布时间】:2013-05-31 12:29:44
【问题描述】:

通常在使用 numpy 时,我发现这种区别很烦人 - 当我从矩阵中提取一个向量或一行,然后使用 np.arrays 执行操作时,通常会出现问题。

为了减少头痛,为了简单起见,我有时只使用np.matrix(将所有np.arrays 转换为np.matrix)。但是,我怀疑会有一些性能影响。任何人都可以评论这些可能是什么以及原因吗?

如果它们都只是底层的数组,那么元素访问只是获取值的偏移量计算,所以如果不阅读整个源代码,我不确定可能会有什么区别。

更具体地说,这对性能有何影响:

v = np.matrix([1, 2, 3, 4])
# versus the below
w = np.array([1, 2, 3, 4])

谢谢

【问题讨论】:

  • 是的,但我的问题是关于性能的,那篇文章中没有提到。我将编辑我的问题以使重点更加清晰。
  • 我怀疑这是否会对性能产生任何重大影响,但如果不确切知道您在创建对象后对它做什么 的计划,就很难说。为什么不做一些测试功能,试试timeit
  • @mgilson 是的,我当然会。我的问题也是“为什么不同”。例如,matlab 对此类数据结构的处理方式相同。所以我认为 numpy 的实现是有原因的。我的问题也是关于理解的。
  • matrix 类是 numpy 的 ndarray 对象的子类,完全用 Python 实现。因此,您对matrix 对象的每次调用都将需要一些额外的 Python 调用,主要是为了确保对象始终保持 2D。所以它可能比ndarray 慢一点,尽管差异很可能可以忽略不计

标签: python performance numpy matrix numpy-ndarray


【解决方案1】:

SciPy.orgthis question 上有一般性讨论。

为了比较性能,我在 iPython 中执行了以下操作。事实证明,数组要快得多。

In [1]: import numpy as np
In [2]: %%timeit
   ...: v = np.matrix([1, 2, 3, 4])
100000 loops, best of 3: 16.9 us per loop

In [3]: %%timeit
   ...: w = np.array([1, 2, 3, 4])
100000 loops, best of 3: 7.54 us per loop

因此,numpy 数组似乎比 numpy 矩阵具有更快的性能。

使用的版本:

Numpy:1.7.1

IPython:0.13.2

Python:2.7

【讨论】:

    【解决方案2】:

    我添加了更多测试,当数组/矩阵较小时,array 似乎比 matrix 快得多,但对于较大的数据结构,差异会变小:

    小(4x4):

    In [11]: a = [[1,2,3,4],[5,6,7,8]]
    
    In [12]: aa = np.array(a)
    
    In [13]: ma = np.matrix(a)
    
    In [14]: %timeit aa.sum()
    1000000 loops, best of 3: 1.77 us per loop
    
    In [15]: %timeit ma.sum()
    100000 loops, best of 3: 15.1 us per loop
    
    In [16]: %timeit np.dot(aa, aa.T)
    1000000 loops, best of 3: 1.72 us per loop
    
    In [17]: %timeit ma * ma.T
    100000 loops, best of 3: 7.46 us per loop
    

    更大 (100x100):

    In [19]: aa = np.arange(10000).reshape(100,100)
    
    In [20]: ma = np.matrix(aa)
    
    In [21]: %timeit aa.sum()
    100000 loops, best of 3: 9.18 us per loop
    
    In [22]: %timeit ma.sum()
    10000 loops, best of 3: 22.9 us per loop
    
    In [23]: %timeit np.dot(aa, aa.T)
    1000 loops, best of 3: 1.26 ms per loop
    
    In [24]: %timeit ma * ma.T
    1000 loops, best of 3: 1.24 ms per loop
    

    请注意,矩阵的乘法实际上稍微快一些。

    我相信我在这里得到的内容与 @Jaime 解释评论的内容一致。

    【讨论】:

    • 性能在很大程度上取决于版本号。您能否在答案中同时说明 numpy 和 Python(2.7.6?)版本?另外,很高兴看到 numpy 1.18 和 Python 3.7/3.8 的数字。
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2018-07-07
    • 2013-07-31
    • 1970-01-01
    • 2021-09-06
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多