10

この質問では、与えられた行列の三角部分lowerにアクセスする方法が説明されています。upper

m = np.matrix([[11, 12, 13],
               [21, 22, 23],
               [31, 32, 33]])

ここで、行列を 1D 配列に変換する必要があります。これは次のようにして実行できます。

indices = np.triu_indices_from(m)
a = np.asarray( m[indices] )[-1]
#array([11, 12, 13, 22, 23, 33])

で多くの計算を行いa、その値を変更した後、対称 2D 配列を埋めるために使用されます。

new = np.zeros(m.shape)
for i,j in enumerate(zip(*indices)):
    new[j]=a[i]
    new[j[1],j[0]]=a[i]

戻る:

array([[ 11.,  12.,  13.],
       [ 12.,  22.,  23.],
       [ 13.,  23.,  33.]])

これを達成するためのより良い方法はありますか?具体的には、Python ループを回避して 2D 配列を再構築しますか?

4

3 に答える 3

7

対称配列を形成したいだけですか?対角インデックスを完全にスキップできます。

m=np.array(m)
inds = np.triu_indices_from(m,k=1)
m[(inds[1], inds[0])] = m[inds]

m

array([[11, 12, 13],
       [12, 22, 23],
       [13, 23, 33]])

以下から対称配列を作成します。

new = np.zeros((3,3))
vals = np.array([11, 12, 13, 22, 23, 33])
inds = np.triu_indices_from(new)
new[inds] = vals
new[(inds[1], inds[0])] = vals
new
array([[ 11.,  12.,  13.],
       [ 12.,  22.,  23.],
       [ 13.,  23.,  33.]])
于 2013-07-08T14:17:26.323 に答える
5

numpy.triunumpy.trilnumpy.diagなどの配列作成ルーチンを使用して、三角形から対称行列を作成できます。これは単純な 3x3 の例です。

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

a_triu = np.triu(a, k=0)
array([[1, 2, 3],
       [0, 5, 6],
       [0, 0, 9]])

a_tril = np.tril(a, k=0)
array([[1, 0, 0],
       [4, 5, 0],
       [7, 8, 9]])

a_diag = np.diag(np.diag(a))
array([[1, 0, 0],
       [0, 5, 0],
       [0, 0, 9]])

転置を追加し、対角線を減算します。

a_sym_triu = a_triu + a_triu.T - a_diag
array([[1, 2, 3],
       [2, 5, 6],
       [3, 6, 9]])

a_sym_tril = a_tril + a_tril.T - a_diag
array([[1, 4, 7],
       [4, 5, 8],
       [7, 8, 9]])
于 2014-12-09T22:15:57.700 に答える