Selectionner les lignes et les colonnes d'un tableau NumPy
J'ai été fou à essayer de comprendre ce stupide chose que je fais mal ici.
Je suis en utilisant NumPy, et j'ai des indices de ligne et de colonne spécifique indices que je veux choisir. Voici le résumé de mon problème:
import numpy as np
a = np.arange(20).reshape((5,4))
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
# If I select certain rows, it works
print a[[0, 1, 3], :]
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [12, 13, 14, 15]])
# If I select certain rows and a single column, it works
print a[[0, 1, 3], 2]
# array([ 2, 6, 14])
# But if I select certain rows AND certain columns, it fails
print a[[0,1,3], [0,2]]
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: shape mismatch: objects cannot be broadcast to a single shape
Pourquoi est-ce arrivé? Certes, je devrait être en mesure de sélectionner les 1er, 2e et 4e lignes, et les 1er et 3ème colonnes? Le résultat que j'attends est:
a[[0,1,3], [0,2]] => [[0, 2],
[4, 6],
[12, 14]]
- Tagged numpy-découpage pour améliorer la localisation. (Aussi, les termes de "tranche" et "découpage" ne se produit pas dans le texte en clair, on pourrait utiliser quelques doublons avec ces termes fermé dans le présent)
- C'est un doublon de stackoverflow.com/questions/19161512/numpy-extract-submatrix
Vous devez vous connecter pour publier un commentaire.
Fantaisie indexation vous demande de fournir tous les indices pour chaque dimension. Vous offrant 3 indices pour le premier, et seulement 2 pour la seconde, d'où l'erreur. Vous voulez faire quelque chose comme ceci:
Qui est bien sûr une douleur d'écrire, de sorte que vous pouvez laisser de radiodiffusion de vous aider à:
C'est beaucoup plus simple à faire si vous index des tableaux, et non pas des listes:
Que Toan l'indique, un simple hack serait de sélectionner les lignes de la première, puis sélectionnez les colonnes sur que.
[Modifier] La méthode intégrée:
np.ix_
J'ai récemment découvert que numpy vous donne un one-liner pour faire exactement ce que @Jaime suggéré, mais sans avoir à utiliser de radiodiffusion de la syntaxe (qui souffre d'un manque de lisibilité). À partir de la documentation:
Si vous l'utiliser comme ceci:
Et la façon dont il fonctionne, c'est qu'il prend soin d'aligner les tableaux de la façon dont Jaime suggéré, afin de radiodiffusion se passe correctement:
Aussi, comme MikeC dit dans un commentaire,
np.ix_
a l'avantage de renvoyer une vue de ma première (pré-edit) réponse n'a pas. Cela signifie que vous pouvez maintenant attribuer au tableau indexé:np.ix_
être plus rapide que la méthode de sélection des premières colonnes et des lignes (en général environ 2x plus rapide sur mes tests de tableaux carrés de tailles 1K-10K, où vous réindexer toutes les lignes et colonnes).UTILISATION:
OU: