2017-02-19 31 views
0

我試圖用多維數組來解決問題,而不是求助於for循環,以獲得性能提升,但在索引編制時遇到問題。用於多維陣列/矩陣的三角形索引和求和軸的選擇

我試過各種使用np.newaxis的排列,但似乎無法實現以下功能。

問題:1

部分)採取的M×N×N的陣列稱爲a,並且對於每個所述M方陣的,設置上三角矩陣的元素作爲其負值。

第2部分)將M個矩陣(形狀爲N×N)中的每個矩陣中的所有元素求和,返回一個具有M個元素的一維數組。我們稱這個數組爲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),但解決了類似的問題有嵌套的for循環...我感覺numpy可能會提供更高效,更智能的基於陣列的解決方案?

任何指導將不勝感激。

感謝

回答

1

是numpy的具有工具

r = 2 

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

無法從數值例子告訴你,如果想在對角線太倒?然後使用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]]])  

其快速使用內置的逐元素的算術

a = a * neg_uppr 

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

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

您可以指定座標軸來總結過:

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

完美的感謝。我沒有意識到np.sum可以爲它的軸創建一個數組參數。這很好。 – IanRoberts