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

さらにいくつかのテストを追加したところ、配列/行列が小さい場合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 に答える