2016-11-15 108 views
2

更改一些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中的条件是按元素进行的,而不是针对每列(或行)进行的。我怎样才能改变这种状况?

有没有更有效的方法来实现这个?

+0

你可以使用一个更大的数组作为样本和更多的数字? – Divakar

+0

您的示例中存在拼写错误很难理解。 ;)我想,它应该是“将被改为'[[0,2,1] [0,4,3]]”,对吗? – nostradamus

+0

我改变了这个例子,我希望现在更清楚吗? – keren42

回答

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]]) 
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:])