J'ai un tableau numpy tel que:
gmm.sigma =
Traceback (most recent call last):
File "test1.py", line 40, in <module>
gmm.sigma = np.append(gmm.sigma, gauss.sigma, axis = 0)
File "/home/rowan/anaconda2/lib/python2.7/site-packages/numpy/lib/function_base.py", line 4528, in append
return concatenate((arr, values), axis=axis)
ValueError: all the input arrays must have same number of dimensions
et je souhaite ajouter une autre matrice 2x2 telle que:
gauss.sigma =
[[[ 4.64 -1.93] [-1.93 6.5 ]] [[ 3.65 2.89] [ 2.89 -1.26]] [[-1.24 2.34] [ 2.34 4.76]]]
pour obtenir:
gmm.sigma =
[[ -1.24 2.34] [ 2.34 4.76]]
I ont essayé: gmm.sigma = np.append (gmm.sigma, gauss.sigma, axis = 0) ,
mais obtenez cette erreur:
[[[ 4.64 -1.93] [-1.93 6.5 ]] [[ 3.65 2.89] [ 2.89 -1.26]]]
Toute aide est appréciée
3 Réponses :
Vous pouvez utiliser dstack qui empile les tableaux en séquence dans le sens de la profondeur (le long du troisième axe) suivi d'une transposition. Pour obtenir la sortie souhaitée, vous devrez empiler gmm.T et gauss
gmm = np.array([[[4.64, -1.93],
[-1.93, 6.5 ]],
[[3.65, 2.89],
[2.89, -1.26]]])
gauss = np.array([[ -1.24, 2.34],
[2.34, 4.76]]).reshape(1,2,2)
result = np.concatenate((gmm, gauss), axis=0)
Sortie strong>
array([[[ 4.64, -1.93],
[-1.93, 6.5 ]],
[[ 3.65, 2.89],
[ 2.89, -1.26]],
[[-1.24, 2.34],
[ 2.34, 4.76]]])
Alternativement , vous pouvez également utiliser concatenate en remodelant correctement votre deuxième tableau comme
gmm = np.array([[[4.64, -1.93],
[-1.93, 6.5 ]],
[[3.65, 2.89],
[2.89, -1.26]]])
gauss = np.array([[ -1.24, 2.34],
[2.34, 4.76]])
result = np.dstack((gmm.T, gauss)).T
print (result)
print (result.shape)
# (3, 2, 2)
Les valeurs résultat [0, 0, 1], résultat [0, 1, 1], résultat [1, 0, 0], résultat [1, 1, 0] ne coïncident pas avec l'attente sortie, est-ce important?
@SebastianPalma: Oh désolé. Vérifiez ma réponse modifiée. J'ai oublié une transposition. Merci pour le rappel
Peut-être que vous n'avez pas besoin de toutes ces transpositions.
@hpaulj: Je l'ai déjà appelé un jour et j'apprécierais que vous puissiez simplement le modifier :) Merci d'avance
On dirait que vous voulez joindre les 2 tableaux sur le premier axe - sauf que le second n'est que 2d. Il a besoin d'une dimension supplémentaire:
In [241]: np.r_['0,3', arr, arr1]
Out[241]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[10, 11],
[12, 13]]])
dstack est une variante de concatenate qui étend tout en 3D et se joint sur le dernier axe. Pour l'utiliser, nous devons tout transposer:
In [236]: np.dstack((arr.T,arr1.T)).T
Out[236]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[10, 11],
[12, 13]]])
index_tricks ajoute des classes qui jouent des tours similaires avec des dimensions:
In [233]: arr = np.arange(8).reshape(2,2,2)
In [234]: arr1 = np.arange(10,14).reshape(2,2)
In [235]: np.concatenate((arr, arr1[None,:,:]), axis=0)
Out[235]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[10, 11],
[12, 13]]])
La documentation de np.r_ nécessite une certaine lecture si vous voulez en tirer le meilleur parti, mais cela pourrait valoir la peine de l'utiliser si vous deviez ajuster les dimensions de plusieurs tableaux, par exemple. np.r _ ['0,3', arr1, arr, arr1]
Comme l'indique le message d'erreur, les dimensions de gmm et gauss_sigma ne sont pas les mêmes, vous devez remodeler gauss_sigma avant d'ajouter.
gmm_sigma = np.array([[[4.64, -1.93], [-1.93, 6.5]], [[3.65, 2.89], [ 2.89, -1.26]]]) gauss_sigma = np.array([[-1.24, 2.34], [2.34, 4.76]]) print(np.append(gmm_sigma, gauss_sigma.reshape(1, 2, 2), axis=0)) # array([[[ 4.64, -1.93], # [-1.93, 6.5 ]], # # [[ 3.65, 2.89], # [ 2.89, -1.26]], # # [[-1.24, 2.34], # [ 2.34, 4.76]]])
Notez que l'erreur montre un appel à concaténer. C'est une bonne idée d'apprendre à utiliser directement cette fonction. Vous voulez joindre un (2,2,2) avec un (2,2). D'une manière ou d'une autre, ce 2ème a besoin d'une dimension supplémentaire, peut-être (1,2,2).