2017-02-19 9 views
0

性能向上のために、forループに頼るのではなく、多次元配列を使用して問題を解決しようとしていますが、多次元配列/行列の三角インデックス付けと総和軸の選択

np.newaxisを使用してさまざまな置換を試みましたが、次の機能を達成できないようです。

問題:

その1)を取るM XのN×N個のアレイはaと呼ばれ、Mの正方行列のそれぞれについて、その負の値として上三角行列の要素を設定します。

パート2)(N×Nの)M個の各マトリックスのすべての要素を合計し、M個の要素を持つ1Dアレイを返します。この配列をbとしましょう。ここで

ソリューションしようとしました

は、ループを使用して、私のMWP /試みです(作業を行いますが、私はむしろ、完全に配列/マトリックスベースのアプローチ

a = np.array(
     [[[ 0, 1], 
     [ 5, 0]], 

     [[ 0, 3], 
     [ 2, 0]]]) 

パート1を見つけるだろう):

triangular_upper_idx = np.triu_indices_from(a[0]) 
for i in range(len(a)): 
    a[i][triangular_upper_idx] *= -1 
a 

結果:

array([[[ 0, -1], 
     [ 5, 0]], 

     [[ 0, -3], 
     [ 2, 0]]]) 

パート2):

b = np.zeros(len(a)) 
for i in range(len(a)): 
    b[i] = np.sum(a[i]) 
b 

結果:

注意が
array([ 4., -1.]) 

:私はこのトピック(Triangular indices for multidimensional arrays in numpy)が、溶液で同様の質問を見てきました がループの入れ子になった... I numpyがより効率的で巧妙な配列ベースのソリューションを提供するように感じる?

ご指摘いただければ幸いです。あなたは対角線があまりにも反転させたい場合は

おかげで

答えて

1

はいnumpyのは、ツール

r = 2 

neg_uppr = np.triu(-np.ones((r,r)),1) + np.tril(np.ones((r,r))) 

を持ってあなたの数値例から言うことができませんか?その後

a = a * neg_uppr 

a 
Out[26]: 
array([[[ 0., -1.], 
     [ 5., 0.]], 

     [[ 0., -3.], 
     [ 2., 0.]]])  

組み込み要素単位算術演算を使用するnp.triu(-np.ones((r,r))) + np.tril(np.ones((r,r)),-1)

neg_uppr 
Out[23]: 
array([[ 1., -1.], 
     [ 1., 1.]]) 

a = np.array(
     [[[ 0, 1], 
     [ 5, 0]], 

     [[ 0, 3], 
     [ 2, 0]]])  

その高速の使用あなたはオーバー合計する軸を指定することができます。

np.sum(a, (1,2)) 
Out[27]: array([ 4., -1.]) 
+0

パーフェクト感謝を。私は、np.sumがその軸の配列引数を持つことができなかったことを認識しませんでした。それは素晴らしい作品です。 – IanRoberts