Numpy: ERROR: la promoción timedelta y float a veces funciona

Creado en 10 jun. 2020  ·  4Comentarios  ·  Fuente: numpy/numpy

Los siguientes ejemplos no conducen a resultados simétricos:

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

Lo mismo es cierto para todos los demás tipos de coma flotante. Me pregunto si hay alguna lógica extraña en esto, como un truco para permitir ciertas llamadas a ufunc, pero todavía no encontré una.

00 - Bug numpy.dtype

Todos 4 comentarios

Parece que al menos np.multiply admite esto.

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

Creo que lo anterior también debería considerarse un error.

Creo que la pregunta es siempre cierto que para ufuncs "las reglas de conversión se implementan por la pregunta de cuándo un tipo de datos se puede convertir" de manera segura "a otro tipo de datos" como se describe en la documentación. Parece que hay excepciones como la anterior en las que la conversión no es segura, pero hemos hecho que ufunc funcione. Supongo que en este caso, Promotion_types debería decir promoción de tipo no válido (para np.promote_types ("float32", "m8") y np.promote_types ("m8", "float32")). Si necesitamos continuar permitiendo que ufunc funcione, ¿se puede decidir caso por caso?

Sí, tenemos que distinguir claramente que np.promote_types debe ser una regla genérica que siempre es razonable. Por eso me gusta el término "dtype común". Este es, por ejemplo, el dtype que se puede usar con np.concatenate .

Cada ufunc individualmente puede decidir implementar una operación específica usando "common dtype" u otra lógica. Lo hacemos específicamente para múltiples y timedelta64, por lo que es un tema aparte.

Supongo que en realidad no usamos esta lógica en muchos lugares, ya que los ufuncs se basan principalmente en np.can_cast(..., ...) como se nota. Y aunque eso suele estar alineado con la promoción de tipos, no está aquí.

Dada la discusión anterior, seguí adelante y agregué la solución para Promotion_types.

¿Fue útil esta página
0 / 5 - 0 calificaciones