Estoy usando la biblioteca de Gizeh y obtengo el error anterior al instalar la última versión de Numpy. No hubo ningún error con la versión 1.08 de Numpy.
File "animation/target_animation.py", line 161, in draw
fill = gizeh.ImagePattern(self.bg.data, self.bg.pos, filter='best')
File "build/bdist.linux-x86_64/egg/gizeh/gizeh.py", line 295, in __init__
File "build/bdist.linux-x86_64/egg/gizeh/gizeh.py", line 50, in from_image
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('uint8') with casting rule 'same_kind'
¿Existe una solución alternativa o solucionaría este problema, por favor?
Necesita hacer el reparto explícito usando el argumento casting
en el np.add
ufunc. El comportamiento del que depende Gizeh ha quedado obsoleto desde la versión 1.7.
Eso es casting='unsafe'
.
¿Dónde debo cambiar esto @charris ?
Por lo general, este es un código como a += b
y debe convertirlo en np.add(a, b, out=a, casting="unsafe")
(si está seguro de que desea el comportamiento de transmisión inseguro. O, a menos que b sea enorme y sea seguro, tal vez solo envíe b primero.
Entiendo que estaba hablando específicamente de los cambios que se realizarán en gizeh / moviepy.
En mi caso, tuve un problema similar. Se resolvió como lo sugirió seberg. Reemplacé la línea 40 en gizeh.py:
arr += image.flatten()
con línea:
arr = np.add(arr, image.flatten(), out=arr, casting="unsafe")
Espero que esto ayude a alguien más.
Tuve este problema al _subtracting_ así:
yn -= self.y_mean
Mi error desapareció cuando hice la resta a través de numpy.subtract , así:
yn = np.subtract(yn, self.y_mean, out=yn, casting="unsafe")
Muchas gracias @seberg : +1:
@ FilipSavic95 : También podría hacer yn -= self.y_mean.astype(yn.dtype)
@ eric-wieser Sí, acabo de probar tu solución y funciona. Gracias por publicarlo. : +1:
La pregunta es qué precisión desea utilizar para la operación en sí. la colada insegura hará la operación con la precisión mayor (dcha.) (o el tipo d seguro combinado) la otra opción hará la colada y por lo tanto la operación con la precisión más baja.
Comentario más útil
Por lo general, este es un código como
a += b
y debe convertirlo ennp.add(a, b, out=a, casting="unsafe")
(si está seguro de que desea el comportamiento de transmisión inseguro. O, a menos que b sea enorme y sea seguro, tal vez solo envíe b primero.