Numpy: BUG: a promoção timedelta e float às vezes funciona

Criado em 10 jun. 2020  ·  4Comentários  ·  Fonte: numpy/numpy

Os exemplos a seguir não levam a resultados simétricos:

np.promote_types("float32", "m8")
# returns "m8", which is probably wrong
np.promote_types("m8", "float32")
# raises TypeError.

O mesmo é verdadeiro para todos os outros tipos de ponto flutuante. Eu me pergunto se há alguma lógica estranha nisso, como um hack para permitir certas chamadas ufunc, mas ainda não encontrei um.

00 - Bug numpy.dtype

Todos 4 comentários

Parece que pelo menos np.multiply suporta isso.

import numpy as np
print(np.multiply(np.timedelta64(1), 1.2))

Acho que o acima também deve ser considerado um bug.

Acho que a questão é sempre verdade que, para ufuncs, "as regras de cast são implementadas pela questão de quando um tipo de dados pode ser convertido" com segurança "para outro tipo de dados", conforme descrito na documentação. Parece que há exceções como acima, onde a conversão não é segura, mas fizemos o ufunc funcionar. Acho que, neste caso, o promotion_types ainda deve dizer promoção de tipo inválido (para np.promote_types ("float32", "m8") e np.promote_types ("m8", "float32")). Se precisamos continuar a permitir que o ufunc funcione pode ser decidido caso a caso?

Sim, temos que distinguir claramente que np.promote_types deve ser uma regra genérica que é sempre razoável. É por isso que gosto do termo "tipo comum". Este é, por exemplo, o tipo d que pode ser usado com np.concatenate .

Cada ufunc individualmente pode decidir implementar uma operação específica usando "dtype comum" ou outra lógica. Nós fazemos isso especificamente para multiple e timedelta64, então esse é um problema separado.

Suponho que não usamos realmente essa lógica em muitos lugares, uma vez que os ufuncs dependem principalmente de np.can_cast(..., ...) como você observou. E embora isso esteja normalmente alinhado com a promoção de tipo, não está aqui.

Dada a discussão acima, fui em frente e adicionei a correção para promotion_types.

Esta página foi útil?
0 / 5 - 0 avaliações