Numpy: ERROR: np.array falla en una lista de matrices con dimensiones parcialmente coincidentes

Creado en 23 mar. 2016  ·  8Comentarios  ·  Fuente: numpy/numpy

Las funciones numpy.array y numpy.asarray tienen un comportamiento bien definido cuando se aplican a listas de matrices: si las matrices enumeradas tienen las mismas dimensiones y tamaño, la lista se convierte en una de las dimensiones de la matriz resultante (llamémosla " modo 1 "). De lo contrario, se devuelve una matriz de matrices ("modo 2").

Sin embargo, el comportamiento de numpy.array y numpy.asarray en "modo 2" parece depender del número de elementos de las matrices. El siguiente código no es muy elegante en relación con la utilidad numpy, pero funciona:

>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
array([array([1, 2, 3]), array([[1, 0],
       [0, 1]])], dtype=object)

Pero lo siguiente no lo hace:

>>> a = np.array([1, 2])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 474, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not broadcast input array from shape (2,2) into shape (2)

Claramente, el problema es que, cuando numpy.asarray ve que la primera dimensión tiene la misma longitud en a y b , intenta ir al "modo 1", lo cual es imposible aquí.

EDITAR: Estoy usando numpy 1.10.4 y python 3.4.3.

00 - Bug numpy.core

Comentario más útil

Proporcionar dtype=object no ayuda; aún obtiene el mismo error.
Sin embargo, agregar una matriz vacía le permite evitarlo:

arr_of_arr = np.array([np.array([]), a, b])[1:]

Todos 8 comentarios

De acuerdo, este tipo de lógica alternativa es lamentable. Hemos discutido no hacer matrices dtype=object menos que se proporcione explícitamente el tipo d. En mi opinión, np.array([a, b], dtype=object) debería ser la única forma de escribir cualquiera de estos, y no debería necesitar hacer ningún control de forma.

Proporcionar dtype=object no ayuda; aún obtiene el mismo error.
Sin embargo, agregar una matriz vacía le permite evitarlo:

arr_of_arr = np.array([np.array([]), a, b])[1:]

Todavía existe en 1.14.4

@ppwwyyxx - de hecho, en parte porque no es un cambio trivial, en parte porque no es algo con lo que uno se golpea todo el tiempo, por lo que la urgencia es relativamente baja (y no hay muchas personas que tengan tiempo para contribuir ...).

Pero lo que podría ayudar aquí es aclarar exactamente cuál sería el comportamiento deseado. @shoyer mencionó la solicitud también de larga data de requerir explícitamente dtype=object si de hecho se desea, de lo contrario, recaudar TypeError para cualquier cosa que no se pueda analizar como una matriz numérica o de cadena (# 5353). Recientemente he estado reflexionando sobre si sería útil tener de manera similar un dtype='structured' , que impondría estrictamente una diferencia entre las listas como elementos indicativos de una matriz y las tuplas como elementos de un dtype estructurado.

Estoy dispuesto a contribuir si alguien me puede enviar algunos consejos sobre qué hacer. Acabo de echar un vistazo al código relacionado en ctors.c, la lógica del constructor parece ser bastante complicada ya que necesita lidiar con muchas formas diferentes de entrada.

Mismo problema: # 8330

Creo que esto podría solucionarse con # 11601. Editar: no lo es.

Entonces, lo que está sucediendo aquí es aproximadamente:

a = np.array([1, 2])
b = np.array([[1, 0], [0, 1]])
out = np.asarray([a, b])
# translates to
out = np.empty((2, 2))  #shape is correctly inferred
out[0,:] = a
out[1,:] = b  # error comes from here
¿Fue útil esta página
0 / 5 - 0 calificaciones