Numpy: ERROR: el descubrimiento de dimensiones falla al mezclar escalares y matrices de forma == (1,)

Creado en 9 dic. 2019  ·  5Comentarios  ·  Fuente: numpy/numpy

np.array([0.25, np.array([0.3])]) fallará al crear una matriz flotante, el tipo d será objeto.

Esto me parece mal, ¿es intencional?

00 - Bug numpy.dtype

Todos 5 comentarios

Cc @nschloe , que está en contra de este tipo de cosas y puede enlazar a su problema

Gracias por CCing. Sí, esto realmente parece algo sobre lo que he estado hablando. : smiley_cat: https://github.com/numpy/numpy/issues/10404

Yo diría que crear una matriz de objetos es lo correcto aquí. Después de todo, estás juntando un flotador y una matriz. Si creó una lista de Python,

[0.25, np.array([0.3])]

esperaría lo mismo: la primera entrada es un flotante, la segunda una matriz de longitud 1. Sería confuso si las listas y np.arrays se comportaran de manera diferente aquí.

Además, crear implícitamente una matriz flotante dtype aquí haría imposible crear una matriz [float, vector[1]] incluso si quisiera.

La mayoría de las veces, especificar np.array([0.25, np.array([0.3])]) se hace por error y se puede arreglar fácilmente; véase, por ejemplo, https://github.com/scipy/scipy/pull/11147/files#diff -21a6a0b0d89357857304bfba2da5a971L321. Después de todo,

Explícito es mejor que implícito.

OK, cerrando. Ese RP habría hecho que los cambios recientes de NEP 34 (desde que se revirtieron) fueran menos perjudiciales para scipy.

@nschloe

La creación implícita de una matriz flotante dtype aquí haría imposible crear una matriz [float, vector [1]] incluso si quisiera.

Para el registro, podría hacer np.array(0.3, np.array([0.3]), dtype=object) .

Si creó una lista de Python ...

Los ndarrays de NumPy son muy diferentes de las listas de Python. No tendría ninguna expectativa de que
np.array([0.2, 0.3, 0.4]) crearía una matriz de objetos, aunque no especifiqué np.float64 para el tipo d. Por lo tanto, estamos de acuerdo en que nos sentimos cómodos con algún nivel de descubrimiento automático de tipo d basado en valores. La pregunta es qué debería tener prioridad: tipos numéricos o tipos de objetos.

Por lo tanto, estamos de acuerdo en que nos sentimos cómodos con algún nivel de descubrimiento automático de tipo d basado en valores.

Creo que la "automatización" es bastante clara aquí: siempre obtenga el tipo de datos "más bajo" que pueda capturar todos los valores de entrada:

numpy.array([1, 2]).dtype   # int64
numpy.array([1, numpy.array(2)]).dtype  # int64, array of rank 0 are basically scalars
numpy.array([1.0, 2]).dtype   # float64
numpy.array([1, [2]]).dtype   # O
¿Fue útil esta página
0 / 5 - 0 calificaciones