Estou usando a biblioteca Gizeh e recebo o erro acima ao instalar a versão mais recente do Numpy. Não houve erro com o Numpy versão 1.08.
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 uma solução alternativa ou você resolveria esse problema, por favor?
Você precisa tornar o elenco explícito usando o argumento casting
no np.add
ufunc. O comportamento do qual Gizeh depende está obsoleto desde 1.7.
Isso é casting='unsafe'
.
onde devo mudar este @charris ?
Normalmente, este é um código como a += b
e você precisa torná-lo np.add(a, b, out=a, casting="unsafe")
(se tiver certeza de que deseja o comportamento de elenco inseguro. Ou, a menos que b seja enorme e seja seguro, talvez apenas elenco b primeiro.
Eu entendo que estava falando especificamente sobre as mudanças a serem feitas no gizeh / moviepy.
No meu caso, tive um problema semelhante. Foi resolvido conforme sugerido por seberg. Substituí a linha 40 em gizeh.py:
arr += image.flatten()
com linha:
arr = np.add(arr, image.flatten(), out=arr, casting="unsafe")
Espero que isso ajude mais alguém.
Eu tive este problema ao _subtracting_ assim:
yn -= self.y_mean
Meu erro foi embora quando fiz a subtração via numpy.subtract , assim:
yn = np.subtract(yn, self.y_mean, out=yn, casting="unsafe")
Muito obrigado @seberg : +1:
@ FilipSavic95 : Também poderia fazer yn -= self.y_mean.astype(yn.dtype)
@ eric-wieser Sim, acabei de tentar sua solução e funciona. Obrigado por postar. : +1:
A questão é qual precisão você deseja usar para a operação em si. o elenco inseguro fará a operação na precisão maior (rhs) (ou o tipo d seguro combinado) a outra opção fará o elenco e, portanto, a operação na precisão inferior.
Comentários muito úteis
Normalmente, este é um código como
a += b
e você precisa torná-lonp.add(a, b, out=a, casting="unsafe")
(se tiver certeza de que deseja o comportamento de elenco inseguro. Ou, a menos que b seja enorme e seja seguro, talvez apenas elenco b primeiro.