2014-06-11 16 views

risposta

7

È possibile utilizzare:

J, I = np.ogrid[:yt, :xt] 
x[idx, J, I] 

Ecco il test:

import numpy as np 

yt, xt = 3, 5 
x = np.random.rand(10, 6, 7) 
y = np.zeros((yt, xt)) 
idx = np.random.randint(0, 10, (yt, xt)) 

for j in range(yt): 
    for i in range(xt): 
     y[j, i] = x[idx[j, i], j, i] 

J, I = np.ogrid[:yt, :xt] 
np.all(x[idx, J, I] == y) 
0

Ecco uno approccio usando linear indexing -

zt,yt,xt = x.shape 
out = x.reshape(zt,-1)[idx.ravel(),np.arange(yt*xt)].reshape(-1,xt) 

test runtime & verifica uscita

Questa sezione confronta l'approccio proposto in questo post e lo other orgid based solution sulle prestazioni e verifica anche le uscite.

definizioni di funzione -

def original_app(x,idx): 
    _,yt,xt = x.shape 
    y = np.zeros((yt,xt)) 
    for j in range(yt): 
     for i in range(xt): 
      y[j, i] = x[idx[j, i], j, i] 
    return y 

def ogrid_based(x,idx): 
    _,yt,xt = x.shape 
    J, I = np.ogrid[:yt, :xt] 
    return x[idx, J, I] 

def reshape_based(x,idx):        
    zt,yt,xt = x.shape 
    return x.reshape(zt,-1)[idx.ravel(),np.arange(yt*xt)].reshape(-1,xt) 

Setup Ingresso -

In [56]: # Inputs 
    ...: zt,yt,xt = 100,100,100 
    ...: x = np.random.rand(zt,yt,xt) 
    ...: idx = np.random.randint(0,zt,(yt,xt)) 
...: 

Verifica uscite -

In [57]: np.allclose(original_app(x,idx),ogrid_based(x,idx)) 
Out[57]: True 

In [58]: np.allclose(original_app(x,idx),reshape_based(x,idx)) 
Out[58]: True 

Timings -

In [68]: %timeit original_app(x,idx) 
100 loops, best of 3: 6.97 ms per loop 

In [69]: %timeit ogrid_based(x,idx) 
1000 loops, best of 3: 391 µs per loop 

In [70]: %timeit reshape_based(x,idx) 
1000 loops, best of 3: 230 µs per loop 
Problemi correlati