2016-11-15 102 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:])