移位的numpy数组的线性和

时间:2018-03-10 15:59:21

标签: arrays numpy

给定一个(m,n)numpy数组A,我想构造(m-1,n-1)numpy数组B,使B [i,j]等于

A[i+1,j+1]+A[i,j]-A[i+1,j]-A[i,j+1]

2 个答案:

答案 0 :(得分:5)

B = A[:-1, :-1] + A[1:, 1:] - A[1:, :-1] - A[:-1, 1:]

例如,

In [37]: A = np.arange(24).reshape((6,4))

In [38]: A
Out[38]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]])

In [39]: B = A[:-1, :-1] + A[1:, 1:] - A[1:, :-1] - A[:-1, 1:]

In [40]: B
Out[40]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

这可以通过利用NumPy数组算法 element-wise 来避免循环。因此,不是在循环中定义B[i,j],而是将整个计算表示为数组切片的总和。

答案 1 :(得分:5)

在这种特定情况下,您可以使用np.diff两次:

B = np.diff(np.diff(A, axis=0), axis=1)

OR

(可能更慢但更通用)使用线性卷积:

from scipy import signal
B = signal.convolve(A, ((1, -1), (-1, 1)), mode='valid')