comprendre la fonction de numpy dstack

j'ai du mal à comprendre ce qu'est num PY dstack fonction est en train de faire. La documentation est plutôt clairsemée et dit simplement:

Stack arrays en sequence depth wise (le long du troisième axe).

prend une séquence de tableaux et les empile le long du troisième axe pour en faire un seul tableau. Reconstruit des tableaux divisés par dsplit. C'est un moyen simple pour empiler des tableaux 2D (images) dans un simple Tableau 3D pour traitement.

donc soit je suis vraiment stupide et la signification de ceci est évidente ou je semble avoir une idée fausse au sujet des termes "empilage", "dans l'ordre", "profondeur sage" ou "le long d'un axe". Cependant, j'ai eu l'impression de comprendre ces termes dans le contexte de vstack et hstack tout simplement parfait.

prenons cet exemple:

In [193]: a
Out[193]: 
array([[0, 3],
       [1, 4],
       [2, 5]])
In [194]: b
Out[194]: 
array([[ 6,  9],
       [ 7, 10],
       [ 8, 11]])
In [195]: dstack([a,b])
Out[195]: 
array([[[ 0,  6],
        [ 3,  9]],

       [[ 1,  7],
        [ 4, 10]],

       [[ 2,  8],
        [ 5, 11]]])

tout d'Abord, a et b Je n'ai pas de troisième axe alors comment les empiler ' troisième axe " pour commencer? Deuxièmement, en supposant que a et b sont des représentations de la 2D des images, pourquoi dois-je finir avec trois tableaux 2D dans le résultat par opposition à deux tableaux 2D "en séquence"?

21
demandé sur ali_m 2014-08-04 14:25:58

3 réponses

il est plus facile de comprendre ce que np.vstack,np.hstack et np.dstack* faire en regardant l' .shape l'attribut du tableau de sortie.

en utilisant vos deux exemples de tableaux:

print(a.shape, b.shape)
# (3, 2) (3, 2)
  • np.vstack concaténates le long de la première dimension...

    print(np.vstack((a, b)).shape)
    # (6, 2)
    
  • np.hstack concaténates le long de la deuxième dimension...

    print(np.hstack((a, b)).shape)
    # (3, 4)
    
  • et np.dstack concatène le long de la troisième dimension.

    print(np.dstack((a, b)).shape)
    # (3, 2, 2)
    

Depuis a et b sont tous les deux bidimensionnels,np.dstack les élargit en insérant une troisième dimension de taille 1. Cela équivaut à les indexer dans la troisième dimension avec np.newaxis (ou, alternativement, None) comme ceci:

print(a[:, :, np.newaxis].shape)
# (3, 2, 1)

Si c = np.dstack((a, b)), puis c[:, :, 0] == a et c[:, :, 1] == b.

vous pouvez faire la même opération plus explicitement en utilisant np.concatenate comme ceci:

print(np.concatenate((a[..., None], b[..., None]), axis=2).shape)
# (3, 2, 2)

* importer tout le contenu d'un module dans votre espace de noms global en utilisant import *considéré comme une mauvaise pratique, pour plusieurs raisons. La façon idiomatique est de import numpy as np.

39
répondu ali_m 2017-05-23 12:03:08

Let x == dstack([a, b]). Puis x[:, :, 0] est identique à a et x[:, :, 1] est identique à b. En général, lorsque dstacking 2D tableaux, dstack produit une sortie telle que output[:, :, n] est identique au tableau d'entrées nth.

si nous empilons des tableaux 3D plutôt que 2D:

x = numpy.zeros([2, 2, 3])
y = numpy.ones([2, 2, 4])
z = numpy.dstack([x, y])

z[:, :, :3] serait identique à x et z[:, :, 3:7] serait identique à y.

comme vous pouvez le voir, nous devons prendre les tranches le long du troisième axe pour récupérer le entrées dstack. C'est pourquoi dstack se comporte comme il le fait.

4
répondu user2357112 2014-08-04 10:56:09

parce que vous mentionnez "images", je pense que cet exemple serait utile. Si vous utilisez Keras pour former un réseau de convolution 2D avec L'entrée X, alors il est préférable de garder X avec la dimension (#images, dim1ofImage, dim2ofImage).

image1 = np.array([[4,2],[5,5]])
image2 = np.array([[3,1],[6,7]])

image1 = image1.reshape(1,2,2)
image2 = image2.reshape(1,2,2)

X = np.stack((image1,image2),axis=1) 
X
array([[[[4, 2],
         [5, 5]],
        [[3, 1],
        [6, 7]]]])

np.shape(X)         
X = X.reshape((2,2,2))   
X 
array([[[4, 2],
        [5, 5]],
       [[3, 1],
        [6, 7]]])

X[0] # image 1
array([[4, 2],
       [5, 5]])
X[1] # image 2
array([[3, 1],
       [6, 7]])             
1
répondu datddd 2017-02-20 22:05:14