Supposons que j'ai un tableau numpy:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
et j'ai un "vecteur" correspondant:
vector = np.array([1,2,3])
Comment puis-je opérer le data
long de chaque ligne pour soustraire ou diviser afin que le résultat soit:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
En bref: comment effectuer une opération sur chaque ligne d'un tableau 2D avec un tableau 1D de scalaires correspondant à chaque ligne?
None
fonctionne toujours de manière équivalente ànp.newaxis
. Je ne suis pas sûr de votre configuration ou du problème exact que vous rencontrez, mais la réponse est toujours valable.Comme cela a été mentionné, trancher avec
None
ou avecnp.newaxes
est un excellent moyen de le faire. Une autre alternative consiste à utiliser les transpositions et la diffusion, comme danset
Pour les tableaux de dimensions supérieures, vous pouvez utiliser la
swapaxes
méthode des tableaux NumPy ou NumPyrollaxis
fonction . Il existe vraiment de nombreuses façons de procéder.Pour une explication plus complète de la diffusion, voir http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
la source
La solution de JoshAdel utilise np.newaxis pour ajouter une dimension. Une alternative consiste à utiliser reshape () pour aligner les dimensions en vue de la diffusion .
Effectuer le remodelage () permet aux dimensions de s'aligner pour la diffusion:
Notez que
data/vector
c'est correct, mais cela ne vous donne pas la réponse que vous voulez. Il divise chaque colonne dearray
(au lieu de chaque ligne ) par chaque élément correspondant devector
. C'est ce que vous obtiendriez si vous vous reformiez explicitementvector
pour être à la1x3
place de3x1
.la source
La manière pythonique de faire ceci est ...
Cela prend en charge le remodelage et les résultats sont également au format à virgule flottante. Dans les autres réponses, les résultats sont au format entier arrondi.
#REMARQUE: le nombre de colonnes dans les données et le vecteur doit correspondre
la source
Ajoutant à la réponse de stackoverflowuser2010, dans le cas général, vous pouvez simplement utiliser
Cela transformera votre vecteur en fichier
column matrix/vector
. Vous permettant d'effectuer les opérations élément par élément comme vous le souhaitez. Au moins pour moi, c'est la manière la plus intuitive de s'y prendre et puisque (dans la plupart des cas) numpy utilisera simplement une vue de la même mémoire interne pour le remodelage, elle est également efficace.la source
.reshape(-1,1)
est la manière la plus intuitive d'utiliser la diffusion.