在numpy中逐列减法

时间:2016-02-15 02:54:19

标签: python numpy

我有一个numpy矩阵我mXn ......

现在,我想执行以下操作:

J(x, y) = I(x+1, y) - I(x, y)

差分算子是“绝对”差异(即矩阵J中没有负值)

现在,我有一个蹩脚的方法来做这个涉及循环,但想避免这里?

修改:The J(x,y) is of size m X (n-1)

3 个答案:

答案 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, :]

代替。