2017-07-14 37 views
1

我有一個這樣的數組:快速的方式來圓陣值根據病情

a = np.array([ 
    [0.02, 1.01, 4.01, 3.00, 5.12], 
    [2.11, 1.50, 3.98, 0.52, 5.01]]) 

和「條件」陣:

c = np.array([0, 1, 4, 5]) 

我要舍a[i][j]=c[k]如果c[k] - const < a[i][j] < c[k] + const,否則a[i][j] = 0例如,const = 0.05。其結果可能是:

a_result = [[0 1 4 0 0] 
      [0 0 4 0 5]] 

的navie方式是使用3 for循環來檢查每個a[i][j]c[k]。然而,當a很大時,它非常緩慢。我們有快速的「蟒蛇方式」來做到這一點嗎?

對於環(慢)解決方案:

a_result = np.full(a.shape, 0)  
const = 0.05  
mh, mw = a.shape 
for i in range(mh-1): 
    for j in range(mw-1): 
     for k in range(1, len(c)): 
       if a[i][j] > (c[k] - const) and a[i][j] < (c[k] + const): 
        a_result[i][j] = c[k] 
+0

檢查Python的'map'運算符;我認爲NumPy有一個更容易適用於數組的應用程序。 – Prune

+0

我剛剛更新了問題@Divakar。 – trminh89

+0

當'a.shape =(2,5)'和'c.size = 4'時,如何理解'a [i] [j] = c [k]'? –

回答

2

方法#1

一個量化的方法是用broadcasting -

c[(np.abs(a - c[:,None,None]) < const).argmax(0)] 

採樣運行 -

In [312]: a 
Out[312]: 
array([[ 0.02, 1.01, 4.01, 3. , 5.12], 
     [ 2.11, 1.5 , 3.98, 0.52, 5.01]]) 

In [313]: c 
Out[313]: array([0, 1, 4, 5]) 

In [314]: c[(np.abs(a - c[:,None,None]) < const).argmax(0)] 
Out[314]: 
array([[0, 1, 4, 0, 0], 
     [0, 0, 4, 0, 5]]) 

方法2

另外一個是接近我們的問題了,但是量化,像這樣 -

mask = ((c[:,None,None] - const) < a) & (a < (c[:,None,None] + const)) 
out = c[mask.argmax(0)] 

方法3

這裏的另一個考慮到內存效率,基於this post -

idx = np.searchsorted(c, a, side="left").clip(max=c.size-1) 
mask = (idx > 0) & \ 
    ((idx == len(xx)) | (np.fabs(yy - xx[idx-1]) < np.fabs(yy - xx[idx]))) 
idx0 = idx-mask 
out = xx[idx0] 
out[np.abs(c[idx0] - a) >= const] = 0