2017-09-22 4 views
1

Considérons le tenseur 3D de T (lxhxd).pavage spécial de la matrice en flux tensoriel ou numpy

Le but est de créer un tenseur de R (w x h x K) où K = d x k en mosaïquant le long de la 3ème dimension d'une manière unique.

Le tenseur doit répéter chaque tranche en 3ème dimension k fois, ce qui signifie:

T[:,:,0]=R[:,:,0:k] and T[:,:,1]=R[:,:,k:2*k] 

Il y a une différence subtile avec carrelage standard qui donne T[:,:,0]=R[:,:,::k], répète à chaque kième 3ème dimension.

+0

Ainsi, a fait le travail de solution affichée pour vous? – Divakar

Répondre

1

Utilisez np.repeat le long de cet axe -

np.repeat(T,k,axis=2) 

run échantillon -

In [688]: # Setup 
    ...: w,h,d = 2,3,4 
    ...: k = 2 
    ...: T = np.random.randint(0,9,(w,h,d)) 
    ...: 
    ...: # Original approach 
    ...: R = np.zeros((w,h,d*k),dtype=T.dtype) 
    ...: for i in range(4): 
    ...:  R[:,:,i*k:(i+1)*k] = T[:,:,i][...,None] 
    ...: 

In [692]: T 
Out[692]: 
array([[[4, 5, 6, 4], 
     [5, 4, 4, 3], 
     [8, 0, 0, 8]], 

     [[7, 3, 8, 0], 
     [8, 7, 0, 8], 
     [3, 6, 8, 5]]]) 


In [690]: R 
Out[690]: 
array([[[4, 4, 5, 5, 6, 6, 4, 4], 
     [5, 5, 4, 4, 4, 4, 3, 3], 
     [8, 8, 0, 0, 0, 0, 8, 8]], 

     [[7, 7, 3, 3, 8, 8, 0, 0], 
     [8, 8, 7, 7, 0, 0, 8, 8], 
     [3, 3, 6, 6, 8, 8, 5, 5]]]) 

In [691]: np.allclose(R, np.repeat(T,k,axis=2)) 
Out[691]: True 

Alternativement avec np.tile et reshape -

np.tile(T[...,None],k).reshape(w,h,-1) 
+0

Pas besoin de refaçonner. 'np.repeat' prend un paramètre' axis'. – user2357112

+0

@ user2357112 Yup, était trop compliqué. Merci, édité. – Divakar

+0

Merci. Je suis juste tombé sur le np.repeat. Cependant, il n'y a pas de contrepartie dans le tensorflow pour le même – user2527599