2
votes

Comment itérer en utilisant numpy au lieu d'une boucle for

Dans le code suivant:

d =0
d+= np.dot(a[5:3],b[4:6])
print(d)

Vous pouvez facilement calculer c utilisant une boucle for. Si je fais ce qui suit au lieu de la boucle for:

import numpy as np

a = np.array([1,3,5,7,9,11,13,15,17,19])
b = np.array([2,4,6,8,10,12,14,16,18,20])

c=0
for n in range(4,6):
    c+= a[9-n]*b[n]
print(c)

Je reçois le message d'erreur:

formes (0,) et (2,) non alignées: 0 (dim 0)! = 2 (dim 0)

Comment modifiez-vous le code pour corriger cela?


1 commentaires

np.dot(a[5:3:-1],b[4:6])


3 Réponses :


1
votes
d+= np.dot(a[5:3],b[4:6])
Look up the details of slicing.  a[5:3] is an empty slice, so it doesn't  match the required length for a dot-product.  You need to specify a step of -1.

0 commentaires

-1
votes

mon amie. pour autant que je puisse voir dans la sortie d'erreur, cela souligne que les deux tableaux NumPy ne sont pas de taille égale, car l'expression que vous spécifiez comme [5: 3] est une tranche vide. Pour résoudre ce problème, procédez comme suit.

d =np.dot(a[4:6],b[4:6])

Si vous pensez que je vous ai mal compris, prévenez-moi.


1 commentaires

Cela ne résout pas le problème donné. Regardez à nouveau l'indexation dans le code affiché.



0
votes

L'erreur de dot nous indique que vos tranches sont fausses. L'un produit des valeurs 0, et l'autre 2. dot nécessite des tailles correspondantes.

In [8]: a[9-4:9-6:-1]
Out[8]: array([11,  9])
In [9]: b[4:6]
Out[9]: array([10, 12])

Regardez les valeurs utilisées par votre index de boucle:

In [5]: idx = np.arange(4,6)
In [6]: idx
Out[6]: array([4, 5])
In [7]: a[9-idx], b[idx]
Out[7]: (array([11,  9]), array([10, 12]))

Essayons de les reproduire.

In [4]: for n in range(4,6):
   ...:     print(a[9-n], b[n])
   ...: 
11 10
9 12

Ou en utilisant le tranchage (avec -1 pas pour reculer):

In [3]: a = np.array([1,3,5,7,9,11,13,15,17,19])
   ...: b = np.array([2,4,6,8,10,12,14,16,18,20])
   ...: 

Vous pouvez maintenant utiliser les 2 tranches du dot .


0 commentaires