2 votes

Peut-on utiliser un tableau 1D pour indexer un tableau 3D et appliquer une multiplication sur un seul axe ?

J'essaie de vectoriser ce processus. J'ai une matrice 4x4x4. J'essaie de multiplier la valeur dans [i,0,num[i]] par le multiplicateur i où i est l'intervalle(data.shape[0]) et de placer le résultat dans [i,0,num[i]]. J'essaie de comprendre comment vectoriser cela. Je ne peux le faire que dans une boucle. J'espère que le code aura plus de sens. Le code n'est pas correct, mais je pense que j'en suis proche.

import numpy as np

data = np.array([[[ 2.,  2.,  2.,  2.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

                 [[ 1.,  1.,  1.,  1.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

                 [[ 3.,  3.,  3.,  3.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

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

num = np.array([1, 2, 2, 3])
multipler = np.array([0.5, 0.6, 0.2, 0.3])

data[:, 1, num] = multipler * data[:, 0, num]

data[:, 2, num] = data[:, 0, num] - data[:, 1, num]

print(data) # This is the goal output

[[[2.  2.  2.  2. ]
  [0.  1.  0.  0.]
  [0.  1.  0.  0.]
  [0.  0.  0.  0. ]]

 [[1.  1.  1.  1. ]
  [0.  0.  0.6 0.]
  [0.  0.  0.4 0.]
  [0.  0.  0.  0. ]]

 [[3.  3.  3.  3. ]
  [0.  0.  0.6 0.]
  [0.  0.  2.4 0.]
  [0.  0.  0.  0. ]]

 [[5.  5.  5.  5. ]
  [0.  0.  0.  1.5]
  [0.  0.  0.  3.5]
  [0.  0.  0.  0. ]]]

1voto

fountainhead Points 3294

Cela fonctionne :

my_range = range(data.shape[0])
data[my_range, 1, num] = data[my_range, 0, num] * multipler
data[my_range, 2, num] = data[my_range, 0, num] - data[my_range, 1, num]

Sortie :

print (data)

[[[2.  2.  2.  2. ]
  [0.  1.  0.  0. ]
  [0.  1.  0.  0. ]
  [0.  0.  0.  0. ]]

 [[1.  1.  1.  1. ]
  [0.  0.  0.6 0. ]
  [0.  0.  0.4 0. ]
  [0.  0.  0.  0. ]]

 [[3.  3.  3.  3. ]
  [0.  0.  0.6 0. ]
  [0.  0.  2.4 0. ]
  [0.  0.  0.  0. ]]

 [[5.  5.  5.  5. ]
  [0.  0.  0.  1.5]
  [0.  0.  0.  3.5]
  [0.  0.  0.  0. ]]]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X