Supposons que j'ai:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
me donne la ième ligne du tableau (par exemple [1, 2]
). Comment puis-je accéder à la ième colonne? (par exemple [1, 3, 5]
). Est-ce aussi une opération coûteuse?
>>> test[:,0]
array([1, 3, 5])
De même,
>>> test[1,:]
array([3, 4])
vous permet d'accéder aux lignes. Ceci est couvert dans la section 1.4 (Indexation) de la référence NumPy . C'est rapide, du moins d'après mon expérience. C'est certainement beaucoup plus rapide que d'accéder à chaque élément d'une boucle.
Et si vous souhaitez accéder à plusieurs colonnes à la fois, vous pouvez le faire:
la source
test[:,[0,2]]
accède simplement aux données, par exemple,test[:, [0,2]] = something
modifierait le test et ne créerait pas un autre tableau. Maiscopy_test = test[:, [0,2]]
crée en fait une copie comme vous le dites.test[:,[0,2]]
accède- t-on simplement aux donnéestest[:, [0, 2]][:, [0, 1]]
sans Il semble très peu intuitif que de refaire la même chose ait un résultat différent.cette commande vous donne un vecteur de ligne, si vous voulez simplement faire une boucle dessus, c'est bien, mais si vous voulez empiler avec un autre tableau de dimension 3xN, vous aurez
tandis que
vous donne un vecteur de colonne, de sorte que vous pouvez faire une opération de concaténation ou de pile d'empilement.
par exemple
la source
Vous pouvez également transposer et renvoyer une ligne:
la source
Pour obtenir plusieurs colonnes indépendantes, il suffit de:
vous obtiendrez des colonnes 0 et 2
la source
Bien que la question ait été répondue, permettez-moi de mentionner quelques nuances.
Disons que vous êtes intéressé par la première colonne du tableau
Comme vous le savez déjà dans d'autres réponses, pour l'obtenir sous forme de "vecteur ligne" (tableau de forme
(3,)
), vous utilisez le découpage:Pour vérifier si un tableau est une vue ou une copie d'un autre tableau, vous pouvez procéder comme suit:
voir ndarray.base .
Outre la différence évidente entre les deux (la modification
arr_c1_ref
affecteraarr
), le nombre d'étapes d'octet pour parcourir chacune d'entre elles est différent:voir les foulées . Pourquoi est-ce important? Imaginez que vous ayez un très grand tableau
A
au lieu dearr
:et vous voulez calculer la somme de tous les éléments de la première colonne, c'est
A_c1_ref.sum()
-à- dire ouA_c1_copy.sum()
. L'utilisation de la version copiée est beaucoup plus rapide:Cela est dû au nombre différent de pas mentionnés précédemment:
Bien qu'il puisse sembler préférable d'utiliser des copies de colonne, ce n'est pas toujours le cas, car la création d'une copie prend du temps et utilise plus de mémoire (dans ce cas, il m'a fallu environ 200 µs pour créer le
A_c1_copy
). Cependant, si nous avons besoin de la copie en premier lieu, ou si nous devons effectuer de nombreuses opérations différentes sur une colonne spécifique du tableau et que nous acceptons de sacrifier la mémoire pour la vitesse, alors faire une copie est la voie à suivre.Dans le cas où nous souhaiterions travailler principalement avec des colonnes, il pourrait être judicieux de créer notre tableau dans l'ordre des colonnes principales ('F') au lieu de l'ordre des lignes principales ('C') (qui est la valeur par défaut). ), puis effectuez le découpage comme précédemment pour obtenir une colonne sans la copier:
Maintenant, effectuer l'opération de somme (ou toute autre) sur une vue en colonne est beaucoup plus rapide.
Enfin, permettez-moi de noter que la transposition d'un tableau et l'utilisation du découpage en ligne sont les mêmes que l'utilisation du découpage en colonne sur le tableau d'origine, car la transposition se fait en échangeant simplement la forme et les enjambées du tableau d'origine.
la source
Ensuite, vous pouvez sélectionner la 2ème - 4ème colonne de cette façon:
la source