7

通常在使用 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])

谢谢

4

2 回答 2

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

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

使用的版本:

麻木:1.7.1

IPython:0.13.2

蟒蛇:2.7

于 2013-06-05T08:46:29.840 回答
5

我添加了更多测试,看起来它比数组/矩阵较小时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 解释评论的内容一致。

于 2013-06-06T00:45:31.447 回答