我正在尝试编写一个接受矩阵A的函数,然后将其偏移一个,并在共享区域上进行元素明确的矩阵乘法。也许一个例子会有所帮助。假设我有矩阵:
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
我想要归还的是: (1 * 2)+(4 * 5)+(7 * 8)= 78
以下代码可以做到,但无效:
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
这是我尝试使用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 :(得分:0)
在这3列案例中,您只是将前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]。没错,如果这是你真正想要的。关键在于“偏移”和“重叠”。