我有一个numpy矩阵我mXn ......
现在,我想执行以下操作:
J(x, y) = I(x+1, y) - I(x, y)
差分算子是“绝对”差异(即矩阵J中没有负值)
现在,我有一个蹩脚的方法来做这个涉及循环,但想避免这里?
修改:The J(x,y) is of size m X (n-1)
答案 0 :(得分:2)
这样的切片怎么样?
# row 1 is all zeros, row 2 is all 1, row 3 all 0s ...
# 10 x 5 matrix
mat = np.array( [ [j%2 for k in range(5)] for j in range(10)])
diff = np.abs(mat[1:,:] - mat[:-1,:])
print diff.shape # 9 x 5
print diff #all ones (no negative one values)
答案 1 :(得分:1)
似乎您可以使用np.diff
以及abs
:
>>> mat
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]])
>>> abs(np.diff(mat, axis=0))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
我不确定此前发布的切片解决方案是否有任何真正的优势 - 当我考虑在numpy数组中采用元素到元素的差异时,我自然会想到{{1} }。 。
修改强>
看起来切片解决方案明显更快:
np.diff
看一下代码,看来numpy只是在引擎盖下构建那些切片并以相同的方式进行减法。对于较大的数组(减法时间开始变得与切片计算相当,这些时间会更接近),但>>> timeit.timeit('abs(np.diff(mat, axis=0))', 'from __main__ import np, mat')
3.239274024963379
>>> timeit.timeit('abs(mat[1:,:] - mat[:-1,:])', 'from __main__ import np, mat')
1.287804126739502
将总是更慢。
答案 2 :(得分:1)
也许是这样的?
import numpy as np
I = np.random.randint(0, 10, (4, 6) )
J = np.abs( np.roll(I,-1, axis=0) - I )
修改强>
上述解决方案假设x中存在周期性边界。您可以使用
删除最后一行J = np.abs( np.roll(I,-1, axis=0) - I )[:-1, :]
代替。