python numpy np.数组与np.矩阵(性能)

hec6srdp  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(153)

在使用numpy时,我经常发现这种区别很烦人--当我从矩阵中取出一个向量或一行,然后使用np.array执行操作时,通常会出现问题。
为了减少麻烦,我已经采取了有时只是使用np.matrix(转换所有np.arrays到np.matrix)只是为了简单。然而,我怀疑有一些性能暗示。任何人可以评论一下那些可能是什么和为什么?
看起来好像它们都是隐藏在幕后的数组,元素访问只是一个偏移量计算,以获得值,所以在没有阅读整个源代码的情况下,我不确定它们之间的区别可能是什么。
更具体地说,这对性能有何影响:

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

谢谢

xoefb8l8

xoefb8l81#

我又添加了一些测试,看起来当数组/矩阵很小时,arraymatrix快得多,但是对于较大的数据结构,差别就小了:
小号(4x 4):

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

较大尺寸(100 x100):

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解释的评论一致。

gcxthw6b

gcxthw6b2#

在www.example.com和this question上有一个一般性的讨论SciPy.org。
为了比较性能,我在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矩阵有更快的性能。

  • 使用的版本:*

纽比:1.7.1
IPython版本:0.13.2
Python语言:2.7

相关问题