2017-08-27 4 views
-1

Dire que j'ai initialisé un tableau en 3D comme:valeurs assignant à des indices en indice spécifiques dans le réseau de python 3D renvoie des erreurs

arr_3d = np.zeros((100, 100, 100)) 

Maintenant, je veux changer les éléments à indices en indice (i, j, k) de arr_3d à une valeur (par exemple 1), où i, j, k sont la liste (ou tableau) d'indices avec les tailles 100, 100, 40, respectivement, le long des trois axes. J'ai essayé arr_3d[i, j, k] = 1, mais il jette une erreur. J'ai essayé de convertir les indices d'indice en indices linéaires par np.ravel_multi_index(), mais il semble qu'il ne peut pas convertir les indices d'indice d'un tableau 3D.

Le problème ci-dessus est facile à résoudre dans Matlab, où arr_3d(i, j, k) = 1 fonctionne.

+2

La valeur par défaut pour MATLAB est d'indexer les tableaux sous forme de blocs, dans ce cas un bloc (100,100,40). L'équivalent numpy le plus proche est 'arr_3d [np.ix_ (i, j, k)]', où 'np.ix_' convertit les 3 tableaux plats en tableaux 3d. Exécutez cette expression 'np.ix_' seule (pour les petits échantillons) pour voir ce qu'elle fait. Plus d'informations sur l'indexation numérique à l'adresse https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing – hpaulj

+0

L'indexation numpy '[i, j, k]' ressemble plus à MATLABs linéaire indexation avec 'idx = sub2ind (taille (A), i, j, k)'. – hpaulj

+0

@hpaulj: Merci, Paul. Cela semble fonctionner, mais l'ordre n'est pas maintenu. Par exemple, 'a = np.zeros ((4, 4, 4))', et 'a [np.ix _ ([0,1,2,3], [0,1,2,3], [0 , 1])] = 1' renvoie un tableau dont les éléments de 2ème et 3ème dimension semblent avoir été permutés. – user11

Répondre

1

essayer avec des dimensions différentes, celles qui sont distincts

In [1375]: a=np.zeros((2, 3, 4)) 
In [1376]: a[np.ix_([0], [1,2], [0,1])] = 1 
In [1377]: a 
Out[1377]: 
array([[[ 0., 0., 0., 0.], 
     [ 1., 1., 0., 0.], 
     [ 1., 1., 0., 0.]], 

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]]) 

numpy divise la matrice pour avions « » sur la première dimension; MATLAB le fait sur le dernier. Donc, cela montre 2 plans ou blocs, chacun 3x4.

En octave

>> a = zeros(2,3,4); 
>> a([1],[2,3],[1,2]) = 1 
a = 

ans(:,:,1) = 

    0 1 1 
    0 0 0 

ans(:,:,2) = 

    0 1 1 
    0 0 0 

ans(:,:,3) = 

    0 0 0 
    0 0 0 

ans(:,:,4) = 

    0 0 0 
    0 0 0 

4 blocs de 2x3.