Numpy: Vstack génial

Créé le 22 juil. 2020  ·  7Commentaires  ·  Source: numpy/numpy

À partir de vstack docs:

Signature: hstack(tup)
Docstring:
Empilez les tableaux en séquence horizontalement (colonne par colonne).

Cela équivaut à la concaténation le long du deuxième axe, sauf pour 1-D
tableaux où il concatène le long du premier axe.

Ma question est pourquoi l'exception ???
Nous avons déjà concatenate() .

Exemple de code de reproduction:

v = rand(5)
concatenate((v, v)).shape
(10,)

hstack((v, v)).shape
(10,)

stack((v, v), axis=1).shape
(5, 2)

vstack((v, v)).shape
(2, 5)

stack((v, v), axis=0).shape
(2, 5)

Il serait beaucoup plus logique d'avoir vstack = stack(axis=1) .

33 - Question

Tous les 7 commentaires

Nous n'encourageons pas hstack / vstack / dstack, et nous encourageons spécifiquement np.stack place. Cependant, la différence est si vous passez dans un tableau 2-D. Certaines des fonctions de pile insèrent de nouvelles dimensions (pour certaines incarnations), je suppose que hstack ne le fait pas.

Ajouter une dernière phrase indiquant que soit np.concatenate ou np.stack sont l'API préférée (généralement) serait bien, mais je ne pense pas que nous ayons de réelles aspirations à supprimer les fonctions.

Ma question est _pourquoi l'exception _ ???

Juste parce que @seberg n'a pas répondu directement à ceci:

  • quelqu'un a pensé il y a longtemps que c'était une bonne idée
  • maintenant il est trop tard pour le changer sans casser tout le monde

Les tableaux 1D sont généralement traités comme "horizontaux" dans numpy plutôt que "verticaux". Par exemple, lors de la diffusion d'un tableau (N, N) 2D avec un tableau (N,) 1D, le tableau 1D est diffusé vers (1, N) et non vers (N, 1) . hstack()/vstack()/dstack() ne sont pas construits autour de concepts d'axes constants (vous pouvez utiliser stack() si vous le souhaitez) mais des concepts de "horizontal / vertical / profondeur" qui ne correspondent pas parfaitement aux axes fixes pour toutes les dimensions du tableau.

Je suis -1 sur le langage décourageant hstack()/vstack()/dstack() , en soi. Je pense toujours qu'ils sont bons et utiles en raison des exceptions dans leur sémantique. Ils capturent des concepts qui ne sont pas capturés de manière concise par stack() .

Par exemple, il existe un besoin courant de préfixer ou d'ajouter une valeur scalaire à un tableau 1D. np.hstack([0.0, some_vector]) fonctionne très bien pour cela. np.stack([0.0, some_vector]) et np.concatenate([0.0, some_vector]) rechignent car ils n'ont pas la même dimensionnalité.

Certes, ces outils sont simplement un peu liés au travail dans un contexte donné je pense. Alors fermons ça. Nous avons les outils génériques sans comportement "funky", et les autres sont là pour rester quand ils sont de bons utilitaires.

@rkern , alors concatenate doit être réparé, à mon humble avis . Empiler signifie concaténer après avoir ajouté un dim supplémentaire, ce qui n'est pas respecté ici. Mais ok…

@seberg , semble qu'un avertissement d' hstack revient à concatenate , oubliant d'ajouter une dimension supplémentaire. Cela semble en effet "funky". Mais si vous n'êtes pas prêt à discuter, eh bien…

Toutes les autres fonctions ?stack ajoutent également des dims supplémentaires uniquement lorsque les dims sont inférieurs à ce qui est nécessaire pour effectuer l'opération maintenant. Dans ce cas, cela ne comprend que 0d.

@Atcold Je suis ouvert aux suggestions pour pousser les utilisateurs vers stack , mais probablement dans les limites de ne pas les effrayer activement d'utiliser ces fonctions.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

keithbriggs picture keithbriggs  ·  3Commentaires

Kreol64 picture Kreol64  ·  3Commentaires

qualiaa picture qualiaa  ·  3Commentaires

manuels picture manuels  ·  3Commentaires

dcsaba89 picture dcsaba89  ·  3Commentaires