2012-07-18 29 views
2

我有一個有趣的謎題。假設你有一個numpy的二維數組,每行對應一個測量事件,每列對應不同的測量變量。此數組中的另一列指定了進行測量的日期。這些行根據時間戳進行排序。每天有幾次(或多次)測量。目標是識別對應於新的一天的行,並從當天的後續行中減去相應的值。以正確的方式在numpy中獲得以下動作

我通過一個循環來解決這個問題,創建一個布爾向量,選擇適當的行,然後減去第一個選定的行。這種方法很有效,但感覺不夠優雅。有沒有更好的方法來做到這一點?

只是一個小例子。下面的線限定的矩陣,其中第一科拉姆 是天,剩下的兩個被測量值

before = array([[ 1, 1, 2], 
    [ 1, 3, 4], 
    [ 1, 5, 6], 
    [ 2, 7, 8], 
    [ 3, 9, 10], 
    [ 3, 11, 12], 
    [ 3, 13, 14]]) 

在過程我希望看到下面的數組的末尾:

array([[1, 0, 0], 
    [1, 2, 2], 
    [1, 4, 4], 
    [2, 0, 0], 
    [3, 0, 0], 
    [3, 2, 2], 
    [3, 4, 4]]) 

PS請幫助我爲這篇文章找到一個更好,更豐富的信息標題。我的想法

回答

4

numpy.searchsorted是一個非常方便的功能:

In : before 
Out: 
array([[ 1, 1, 2], 
     [ 1, 3, 4], 
     [ 1, 5, 6], 
     [ 2, 7, 8], 
     [ 3, 9, 10], 
     [ 3, 11, 12], 
     [ 3, 13, 14]]) 

In : diff = before[before[:,0].searchsorted(x[:,0])] 

In : diff[:,0] = 0 

In : before - diff 
Out: 
array([[1, 0, 0], 
     [1, 2, 2], 
     [1, 4, 4], 
     [2, 0, 0], 
     [3, 0, 0], 
     [3, 2, 2], 
     [3, 4, 4]]) 

較長的解釋

如果你把第一列,並搜索本身,你得到的最低指數這些特定值:

In : before 
Out: 
array([[ 1, 1, 2], 
     [ 1, 3, 4], 
     [ 1, 5, 6], 
     [ 2, 7, 8], 
     [ 3, 9, 10], 
     [ 3, 11, 12], 
     [ 3, 13, 14]]) 

In : before[:,0].searchsorted(x[:,0]) 
Out: array([0, 0, 0, 3, 4, 4, 4]) 

然後,您可以使用它來構建矩陣,您將su btract通過索引:

In : diff = before[before[:,0].searchsorted(x[:,0])] 

In : diff 
Out: 
array([[ 1, 1, 2], 
     [ 1, 1, 2], 
     [ 1, 1, 2], 
     [ 2, 7, 8], 
     [ 3, 9, 10], 
     [ 3, 9, 10], 
     [ 3, 9, 10]]) 

你需要做的第一列0,使他們不會被扣除。

In : diff[:,0] = 0 

In : diff 
Out: 
array([[ 0, 1, 2], 
     [ 0, 1, 2], 
     [ 0, 1, 2], 
     [ 0, 7, 8], 
     [ 0, 9, 10], 
     [ 0, 9, 10], 
     [ 0, 9, 10]]) 

最後,減去兩個矩陣以獲得所需的輸出:

In : before - diff 
Out: 
array([[1, 0, 0], 
     [1, 2, 2], 
     [1, 4, 4], 
     [2, 0, 0], 
     [3, 0, 0], 
     [3, 2, 2], 
     [3, 4, 4]])