numpy np.array与np.matrix(性能)

lol*_*ter 7 python numpy

通常在使用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])
Run Code Online (Sandbox Code Playgroud)

谢谢

ato*_*3ls 5

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
Run Code Online (Sandbox Code Playgroud)

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

使用的版本:

Numpy:1.7.1

IPython:0.13.2

Python:2.7


Aka*_*all 5

我添加了一些更多的测试,并且它看起来arraymatrix数组/矩阵小时快得多,但是对于更大的数据结构,差异变小了:

小:

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
Run Code Online (Sandbox Code Playgroud)

大:

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
Run Code Online (Sandbox Code Playgroud)

请注意,矩阵实际上对于乘法来说稍微快一些.

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