2016-08-15 84 views
0

我正在嘗試編寫一個函數,該函數需要一個矩陣A,然後將其偏移一個,然後在共享區域上執行元素明智的矩陣乘法。也許一個例子會有所幫助。假設我有矩陣:有效地將矩陣與自身相乘,然後將其抵消一個numpy

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

什麼我想返回的是: (1 * 2)+(4 * 5)+(7 * 8)= 78

下面的代碼做它但inefficently:

import numpy as np 

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

Height = A.shape[0] 
Width = A.shape[1] 

Sum1 = 0 
for y in range(0, Height):  
     for x in range(0,Width-2): 
      Sum1 = Sum1 + \ 
       A.item(y,x)*A.item(y,x+1) 
      print("%d * %d"%(A.item(y,x),A.item(y,x+1))) 

print(Sum1) 

隨着輸出:

1 * 2 
4 * 5 
7 * 8 
78 

這是我嘗試寫的代碼更efficentl y with numpy:

import numpy as np 

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

print(np.sum(np.multiply(A[:,0:-1], A[:,1:]))) 

不幸的是,這一次我得到了186個。我不知道該怎麼去錯了。我喜歡有人來糾正我或提供另一種方式來實現這一點。

謝謝。

+0

您需要提供更準確的描述。爲什麼你的操作不會對'A'的最後一列做任何事情?這是如何「在共享區域上元素明智的矩陣乘法」? – user2357112

+0

'np.dot(A [:,0],A [:,1])'返回'78'。 – Psidom

+0

IIUC您需要沿第一個軸使用求和:'np.sum(np.multiply(A [:,0:-1],A [:,1:]),axis = 0)'。使用'default np.sum()',它將所有內容總結爲一個標量。 – Divakar

回答

0

在這3列的情況下,你只是乘以1日2列,並採取總和:

A[:,:2].prod(1).sum() 
Out[36]: 78 

(A[:,0]*A[:,1]).sum()

現在只是如何不會推廣到更多的列?

在原來的循環,你可以通過這個列表的總和切出該行迭代:

[A[:,x]*A[:,x+1] for x in range(0,A.shape[1]-2)] 
Out[40]: [array([ 2, 20, 56])] 

有關共享面積乘以你的描述會談;你在做什麼方向的偏移量?從計算看來,偏移量是負值。

A[:,:-1] 
Out[47]: 
array([[1, 2], 
     [4, 5], 
     [7, 8]]) 

如果是這樣的偏移邏輯,不是我可以重寫我的計算是

A[:,:-1].prod(1).sum() 

應該有更多的列上工作。

===================

你的第二個嘗試:

In [3]: [A[:,:-1],A[:,1:]] 
Out[3]: 
[array([[1, 2], 
     [4, 5], 
     [7, 8]]), 
array([[2, 3], 
     [5, 6], 
     [8, 9]])]  

In [6]: A[:,:-1]*A[:,1:] 
Out[6]: 
array([[ 2, 6], 
     [20, 30], 
     [56, 72]]) 

In [7]: _.sum() 
Out[7]: 186 

換句話說,而不是1 * 2,你正在計算[1,2] * [2 * 3] = [2,6]。沒有錯,如果那是你真正打算的。關鍵在於「抵消」和「重疊」。

相關問題