给定一个(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]
答案 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')