在将矩阵与numpy偏移一个之后,将矩阵与其自身相乘

时间:2016-08-15 16:50:05

标签: python numpy

我正在尝试编写一个接受矩阵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.我不知道哪里出错了。我爱一个人要么纠正我,要么提供另一种方式来实现这一点。

谢谢。

1 个答案:

答案 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]。没错,如果这是你真正想要的。关键在于“偏移”和“重叠”。