Python 根据逻辑条件更改某些numpy数组列

Python 根据逻辑条件更改某些numpy数组列,python,arrays,numpy,Python,Arrays,Numpy,我有一个2DNumPy数组,我想执行以下操作: 对于数组中的每一列(这是一系列非递减值),将此列替换为一列差异(即,每个条目都是前两个条目之间的差异) 其他每一列都保持不变(除了删除第一行以适应差异列维度) 例如,在矩阵中: [ [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] ] 因此,具有递减值的第三列和第五列将保持不变,而其他列将替换为差异列,结果为: [ [

我有一个
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.中的条件,
是按元素执行的,而不是针对每一列(或每一行)

我如何才能改变条件,使其工作?有没有更有效的方法来实现这一点?

您可以使用-

#获取沿第一个轴的微分
差异=np.差异(a,轴=0)
#无效者的面具
mask=(diff您可以这样尝试:

b = a[1:] - a[:-1]
decrease = numpy.where(numpy.min(b, axis=0)<0)
b[:,decrease] = a[1:, decrease]

你能不能用一个更大的数组作为样本和更多种类的数字?很难理解你的例子中是否有输入错误。我想,应该是“将被更改为
[[0,2,1][0,4,3]]
”,对吗?我更改了例子,希望现在更清楚了?
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]])
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:])