5

A[:,:,n]m * m * n numpy配列(Aと呼びます)があり、この配列内のすべての部分行列の固有値を見つけたいと思います。私はlinalg.eig()比較的簡単にループでそれを行うことができましたが、これをベクトル化する方法が本当にあるはずです。のようなものですufuncが、個々の要素の代わりにサブベクトルを処理できます。これは可能ですか?

4

1 に答える 1

2

固有値と固有ベクトルの計算は、一般に異なる行列の作業を共有する方法がないという意味でベクトル化できません。np.linalg.eig(実際の入力の場合) は単なるラッパーですdgeev。ドキュメントによると、呼び出しごとに単一の行列のみを受け入れ、計算はかなり高価であるため、小さくない行列の場合、Python ループのオーバーヘッドは無視できます。

ただし、これを多くの非常に小さな行列に対して行うと、遅くなりすぎる可能性があります。これに関連するいくつかの質問があり、解決策は通常、コンパイルされた拡張機能になります。enigmaticPhysicist がコメントで述べているように、サブベクトルとサブマトリックスを ufunc と同じ方法で処理するという考えは、一般的に有用です。これらは一般化された ufunc と呼ばれ、numpy の開発版に既に含まれています。shape の行列の場合、約 8 倍高速であることがわかります(1000, 3, 3)

In [2]: np.__version__
Out[2]: '1.8.0.dev-dcf7cac'

In [3]: A = np.random.rand(1000, 3, 3)

In [4]: timeit np.linalg.eig(A)
P100 loops, best of 3: 9.65 ms per loop

In [5]: timeit [np.linalg.eig(Ai) for Ai in A]
10 loops, best of 3: 74.6 ms per loop

In [6]: a1 = np.linalg.eig(A)

In [7]: a2 = [np.linalg.eig(Ai) for Ai in A]

In [8]: all(np.allclose(a1[i][j], a2[j][i]) for j in xrange(1000) for i in xrange(2))
Out[8]: True
于 2012-11-23T15:42:18.747 に答える