我有一个2D
NumPy
数组,我想执行以下操作:
对于数组中的每一列(一系列非递减值),将此列替换为差异列(即,每个条目是前两个条目之间的差异)。
每隔一列保持不变(除非删除第一行以适合差异列维度)。
例如,在矩阵中:
[ [1,1,1,2,3,4]
[1,3,4,3,4,5]
[1,7,3,4,2,7] ]
差异矩阵是:
[ [0,2,3,1,1,1]
[0,4,-1,1,-1,2] ]
因此,具有递减值的第三列和第五列将保持不变,而其他列将替换为差异列,结果为:
[ [0,2,4,1,4,1]
[0,4,3,1,2,2] ]
我试过这样的事情:
tempX = np.diff(X, axis = 0).transpose()
return np.where(tempX >= 0, tempX, X[1:].transpose())
但np.where
中的条件是按元素执行的,而不是针对每列(或行)执行的。
如何更改条件以使其有效?有没有更有效的方法来实现这个?
答案 0 :(得分:1)
您可以这样尝试:
b = a[1:] - a[:-1]
decrease = numpy.where(numpy.min(b, axis=0)<0)
b[:,decrease] = a[1:, decrease]
您也可以在一个表达式中执行此操作:
numpy.where(numpy.min(a[1:]-a[:-1],axis=0)>=0, a[1:]-a[:-1], a[1:])
答案 1 :(得分:0)
您可以使用boolean-indexing
-
# Get the differentiation along first axis
diffs = np.diff(a,axis=0)
# Mask of invalid ones
mask = (diffs<0).any(0)
# Use the mask to set the invalid ones to the original elements
diffs[:,mask] = a[1:,mask]
示例运行 -
In [141]: a
Out[141]:
array([[1, 1, 1, 2, 3, 4],
[1, 3, 4, 3, 4, 5],
[1, 7, 3, 4, 2, 7]])
In [142]: diffs = np.diff(a,axis=0)
...: mask = (diffs<0).any(0)
...: diffs[:,mask] = a[1:,mask]
...:
In [143]: diffs
Out[143]:
array([[0, 2, 4, 1, 4, 1],
[0, 4, 3, 1, 2, 2]])