2016-08-15 26 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]。没有错,如果那是你真正打算的。关键在于“抵消”和“重叠”。

相关问题