Numpy: BOGUE: np.array échoue sur une liste de tableaux avec des dimensions partiellement correspondantes

Créé le 23 mars 2016  ·  8Commentaires  ·  Source: numpy/numpy

Les fonctions numpy.array et numpy.asarray ont un comportement bien défini lorsqu'elles sont appliquées à des listes de tableaux: si les tableaux listés ont les mêmes dimensions et taille, la liste est tournée dans l'une des dimensions du tableau résultant (appelons-la " mode 1 "). Sinon, un tableau de tableaux est renvoyé ("mode 2").

Cependant, le comportement de numpy.array et numpy.asarray en "mode 2" semble dépendre du nombre d'éléments dans les tableaux. Le code suivant n'est pas très élégant par rapport à l'utilité numpy, mais fonctionne:

>>> 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)

Mais ce qui suit ne fait pas:

>>> 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)

Clairement, le problème est que, lorsque numpy.asarray voit que la première dimension a la même longueur en a et b , il essaie de passer en "mode 1", ce qui est impossible ici.

EDIT: J'utilise numpy 1.10.4 et python 3.4.3.

00 - Bug numpy.core

Commentaire le plus utile

Fournir dtype=object n'aide pas - vous obtenez toujours la même erreur.
Cependant, l'ajout d'un tableau vide vous permet de l'éviter:

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

Tous les 8 commentaires

D'accord, ce genre de logique de repli est malheureux. Nous avons discuté de ne pas créer dtype=object tableaux np.array([a, b], dtype=object) devrait être le seul moyen d'écrire l'un ou l'autre - et il ne devrait pas avoir besoin de vérifier la forme.

Fournir dtype=object n'aide pas - vous obtenez toujours la même erreur.
Cependant, l'ajout d'un tableau vide vous permet de l'éviter:

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

Existe toujours en 1.14.4

@ppwwyyxx - en effet, en partie car ce n'est pas un changement trivial, en partie parce que ce n'est pas quelque chose dont on est frappé tout le temps, donc l'urgence est relativement faible (et il n'y a pas beaucoup de gens qui ont le temps de contribuer ...).

Mais ce qui pourrait aider ici, c'est de clarifier exactement quel serait le comportement souhaité. @shoyer a mentionné la demande de longue date d'exiger explicitement dtype=object si cela est en fait voulu, sinon lever TypeError pour tout ce qui ne peut pas être analysé comme un tableau numérique ou de chaînes (# 5353). Je me suis demandé récemment s'il serait utile d'avoir de la même manière un dtype='structured' , ce qui imposerait strictement une différence entre les listes comme indiquant les éléments d'un tableau et les tuples comme les éléments d'un dtype structuré.

Je suis prêt à contribuer si quelqu'un peut m'envoyer des conseils sur ce qu'il faut faire. Je viens de jeter un coup d'œil au code associé dans ctors.c, la logique du constructeur semble être assez compliquée car elle doit traiter de nombreuses formes d'entrée différentes.

Même problème: # 8330

Je pense que cela pourrait être corrigé par # 11601. Edit: Ce n'est pas le cas.

Donc, ce qui se passe ici est à peu près:

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
Cette page vous a été utile?
0 / 5 - 0 notes