Comment ajouter des lignes à un tableau numpy?
J'ai un tableau A:
A = array([[0, 1, 2], [0, 2, 0]])
Je souhaite ajouter des lignes à ce tableau à partir d'un autre tableau X si le premier élément de chaque ligne de X remplit une condition spécifique.
Les tableaux Numpy n'ont pas de méthode «ajouter» comme celle des listes, du moins c'est ce qu'il semble.
Si A et X étaient des listes, je ferais simplement:
for i in X:
if i[0] < 3:
A.append(i)
Existe-t-il une manière numpythonique de faire l'équivalent?
Merci, S ;-)
Réponses:
C'est quoi
X
? S'il s'agit d'un tableau 2D, comment pouvez-vous comparer sa ligne à un nombrei < 3
:?EDIT après le commentaire d'OP:
ajouter à
A
toutes les lignes d'X
où le premier élément< 3
:la source
A
. Clairement, pour un petit problème comme dans cette réponse, ce n'est pas un problème, mais cela peut être plus inquiétant pour les données volumineuses.Eh bien, vous pouvez le faire:
la source
Comme cette question remonte à 7 ans auparavant, dans la dernière version que j'utilise est numpy version 1.13, et python3, je fais la même chose avec l'ajout d'une ligne à une matrice, n'oubliez pas de mettre un double crochet au deuxième argument, sinon, cela provoquera une erreur de dimension.
Ici, j'ajoute la matrice A
avec une rangée
même usage dans
np.r_
Juste à l'intérêt de quelqu'un, si vous souhaitez ajouter une colonne,
array = np.c_[A,np.zeros(#A's row size)]
en suivant ce que nous avons fait auparavant sur la matrice A, en y ajoutant une colonne
la source
Si aucun calcul n'est nécessaire après chaque ligne, il est beaucoup plus rapide d'ajouter des lignes en python, puis de les convertir en numpy. Voici les tests de synchronisation utilisant python 3.6 contre numpy 1.14, ajoutant 100 lignes, une à la fois:
Ainsi, la solution simple à la question d'origine, il y a sept ans, consiste à utiliser vstack () pour ajouter une nouvelle ligne après la conversion de la ligne en un tableau numpy. Mais une solution plus réaliste devrait tenir compte des faibles performances de vstack dans ces circonstances. Si vous n'avez pas besoin d'exécuter l'analyse des données sur le tableau après chaque ajout, il est préférable de mettre en tampon les nouvelles lignes dans une liste de lignes python (une liste de listes, vraiment), et de les ajouter en tant que groupe au tableau numpy en utilisant vstack () avant de faire une analyse de données.
la source
Vous pouvez également faire ceci:
la source
np.concatenate((A,newrow), axis=0)
1.12.1
(et en Python 3), il semble que tenter de concaténer un vecteur à une matrice augmenteValueError: all the input arrays must have same number of dimensions
. Il semble qu'il souhaite que le vecteur soit redéfini explicitement en un vecteur de colonne ou de ligne avant de vouloir le concaténer.newrow = [[1,2,3]]
la source
Si vous pouvez faire la construction en une seule opération, alors quelque chose comme la réponse vstack-with-fancy-indexing est une bonne approche. Mais si votre condition est plus compliquée ou si vos lignes arrivent à la volée, vous voudrez peut-être agrandir le tableau. En fait, la façon numpythonic de faire quelque chose comme ça - faire croître dynamiquement un tableau - est de développer dynamiquement une liste:
Les listes sont hautement optimisées pour ce type de modèle d'accès; vous n'avez pas d'indexation multidimensionnelle numpy pratique sous forme de liste, mais tant que vous ajoutez, il est difficile de faire mieux qu'une liste de tableaux de lignes.
la source
J'utilise 'np.vstack' qui est plus rapide, EX:
la source
Vous pouvez utiliser
numpy.append()
pour ajouter une ligne à un tableau numpty et le remodeler en une matrice ultérieurement.la source