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"?
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
.
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.
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]])