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

时间:2016-11-15 10:25:16

标签: python arrays numpy

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

如何更改条件以使其有效?有没有更有效的方法来实现这个?

2 个答案:

答案 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]])