2012-12-18 44 views
2

矢量化numpy的陣列我試圖找出如何向量化下面的循環:for循環

for i in range(1,size): 
    if a[i] < a[i-1]: 
     b[i] = a[i] 
    else: b[i] = b[i-1] 

b是大小相同的(大)陣列。 我可以使用if語句,但你如何同時更換else語句

numpy.where(a[1:]<a[:-1]) 

更換?

+1

我不認爲這是可以向量化,因爲每個元素依賴於前一個。 – Eric

+0

這是一個猜測,但'vectorize'文檔說它的矢量化函數接受*序列*。你能改寫你的循環作爲一個發電機嗎? –

回答

2

我想你想是這樣的:

import numpy as np 

def foo(a, b): 
    # cond is a boolean array marking where the condition is met 
    cond = a[1:] < a[:-1] 
    cond = np.insert(cond, 0, False) 
    # values is an array of the items in from a that will be used to fill b 
    values = a[cond] 
    values = np.insert(values, 0, b[0]) 
    # labels is an array of increasing indices into values 
    label = cond.cumsum() 
    b[:] = values[label] 
+0

這表示感謝。現在確保我理解它,然後測試它的速度。 – Jonno

+0

我希望這給你一些加速。如果你有更多關於b的信息,你可能會獲得更多的加速。例如,如果你事先知道b應該單調遞增。 –

1

docs

numpy.where(condition[, x, y])

返回元件,無論是從x或y,取決於條件。

因此可以簡化包含一個循環:

if cond: 
    a[i] = b[i] 
else: 
    a[i] = c[i] 

a = numpy.where(cond, a, b) 

不過,我不認爲你的例子可以向量化,因爲每個元素依賴於前一個。

+0

我認爲你是對的。那麼,如果無法實現矢量化,那麼有什麼方法可以加速這樣的操作? – Jonno