web-dev-qa-db-fra.com

Impossible d'utiliser / = sur un tableau numpy

Sur un tableau numpy, pourquoi puis-je utiliser avec succès / 2:

>>> a=np.array([2, 4, 6])
>>> a = a / 2
>>> a
array([ 1.,  2.,  3.])

Mais je ne peux pas utiliser a /= 2?

>>> a=np.array([2, 4, 6])
>>> a /= 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide

J'ai vu numpy Issue 6464 , mais je ne comprends pas en le lisant et la version liée note la raison pour laquelle cela ne fonctionne pas.

Existe-t-il un moyen d'obtenir /= pour travailler comme prévu?

13
Tom Hale

Comme indiqué dans le commentaire, le passage de int (qui est la façon dont a est créé) à float (qui est la réutilisation de /) n'est pas autorisé lors de l'utilisation de /=. Pour "corriger" cela, le dtype de a doit simplement être un flottant depuis le début:

a=np.array([2, 4, 6], dtype=np.float64)
a/=2
print(str(a))
>>>array([1., 2., 3.])
9
FlyingTeller

Comme mentionné dans les commentaires, a / 2 produit un tableau flottant, mais le type de a est entier. Étant donné que les opérateurs d'affectation de NumPy sont optimisés pour réutiliser le même tableau (c'est-à-dire a = a + 2 et a += 2 ne sont pas exactement identiques, le premier crée un nouveau tableau tandis que le second réutilise simplement celui existant), vous ne pouvez pas les utiliser lorsque le résultat a un type différent. Si vous voulez une division entière, vous pouvez utiliser le //= opération d'affectation:

>>> a = np.array([2, 4, 6])
>>> a //= 2
>>> a
array([1, 2, 3])
6
jdehesa