5

固有値の計算をベクトル化する numpy-sh の方法が必要です。これにより、行列の行列を入力して、それぞれの固有値の行列を返すことができます。

たとえば、以下のコードでは、B は 3x3 マトリックス A の 4 つのコピーで構成されるブロック 6x6 マトリックスです。C は、出力として見たいもの、つまり次元 (2,2,3) の配列です (なぜなら A 3 つの固有値があります)。

もちろん、これは非常に単純化された例であり、一般的な場合、行列 A は任意のサイズを持つことができ (それでも正方形ですが)、行列 B は必ずしも A のコピーで構成されるとは限りませんが、異なる A1、A2 など (すべて同じサイズだが異なる要素を含む)。

import numpy as np
A = np.array([[0, 1, 0],
              [0, 2, 0],
              [0, 0, 3]])
B = np.bmat([[A, A], [A,A]])
C = np.array([[np.linalg.eigvals(B[0:3,0:3]),np.linalg.eigvals(B[0:3,3:6])],
              [np.linalg.eigvals(B[3:6,0:3]),np.linalg.eigvals(B[3:6,3:6])]])
4

2 に答える 2

4

編集: numpy >= 1.8.0 のバージョンを使用している場合np.linalg.eigvals渡した配列の最後の 2 次元で動作するため、入力を配列に再形成する場合は、 1 回(n_subarrays, nrows, ncols)呼び出すだけで済みます。eigvals

import numpy as np

A = np.array([[0, 1, 0],
              [0, 2, 0],
              [0, 0, 3]])

# the input needs to be an array, since matrices can only be 2D.
B = np.repeat(A[np.newaxis,...], 4, 0)

# for arbitrary input arrays you could do something like:
# B = np.vstack(a[np.newaxis,...] for a in input_arrays)
# but for this to work it will be necessary for each element in 
# 'input_arrays' to have the same shape

# eigvals will operate over the last two dimensions of the array and return
# a (4, 3) array of eigenvalues
C = np.linalg.eigvals(B)

# reshape this output so that it matches your original example
C.shape = (2, 2, 3)

入力配列の次元がすべて同じでない場合 (例:などinput_arrays[0].shape == (2, 2))、input_arrays[1].shape == (3, 3)次元が一致するサブセット間でのみこの計算をベクトル化できます。

numpy の古いバージョンを使用している場合、残念ながら、複数の入力配列に対する固有値の計算をベクトル化する方法はないと思います。代わりに、Python で入力をループするだけで済みます。

于 2013-10-19T19:03:51.243 に答える