移位的numpy数组的线性和

fac*_*act 1 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]
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

B = A[:-1, :-1] + A[1:, 1:] - A[1:, :-1] - A[:-1, 1:]
Run Code Online (Sandbox Code Playgroud)

例如,

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]])
Run Code Online (Sandbox Code Playgroud)

这通过利用NumPy数组算法以元素方式执行的事实来避免循环.因此,不是B[i,j]在循环中定义,而是将整个计算表示为数组切片的总和.


Pau*_*zer 5

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

B = np.diff(np.diff(A, axis=0), axis=1)
Run Code Online (Sandbox Code Playgroud)

要么

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

from scipy import signal
B = signal.convolve(A, ((1, -1), (-1, 1)), mode='valid')
Run Code Online (Sandbox Code Playgroud)