J'ai un tableau A de taille [1, x] de valeurs et un tableau B de taille [1, y] (y> x) d'index correspondant au tableau A . Je veux comme résultat un tableau C de taille [1, y] rempli de valeurs de A .
Voici un exemple d'entrées et résultats:
>>> C = [] >>> for val in B: >>> C.append(A[val])
Bien sûr, je pourrais le résoudre comme ça:
>>> A = [6, 7, 8] >>> B = [0, 2, 0, 0, 1] >>> C = #Some operations >>> C [6, 8, 6, 6, 7]
Mais on m'attendait en fait d'une manière plus agréable pour le faire. Surtout parce que je veux l'utiliser comme argument d'une autre fonction. Une expression ressemblant à A [B] (mais qui fonctionne) serait idéale. Cela ne me dérange pas d'utiliser NumPy ou pandas.
6 Réponses :
Vous pouvez le faire avec la compréhension de liste:
>>> A = [6, 7, 8] >>> B = [0, 2, 0, 0, 1] >>> C = [A[x] for x in B] >>> print(C) [6, 8, 6, 6, 7]
Je pense que vous avez besoin d'un générateur (compréhension de liste):
A = [1, 2, 3] B = [0, 2, 0, 0, 1] C = [A[i] for i in B]
Bien que votre réponse soit correcte, l'esprit: la compréhension de la liste du générateur <>.
Pour récupérer plusieurs éléments De plus, comme vous l'avez mentionné Une autre option consiste à utiliser operator.itemgetter a > est pratique: np.take(A,B)
# array([6, 8, 6, 6, 7])
numpy , cela pourrait être fait directement en indexant le tableau comme vous l'avez spécifié, c'est-à-dire A[B :import numpy as np
A = np.array([6, 7, 8])
B = np.array([0, 2, 0, 0, 1])
A[B]
# array([6, 8, 6, 6, 7])
np.take : from operator import itemgetter
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]
itemgetter(*B)(A)
# (6, 8, 6, 6, 7)
Simple avec une compréhension de liste:
[6, 8, 6, 6, 7]
Cela donne
A = [6, 7, 8] B = [0, 2, 0, 0, 1] C = [A[i] for i in B] print(C)
Une fois que vous utilisez numpy.array , vous pouvez faire exactement ce que vous voulez avec la syntaxe attendue:
>>> a = array([6, 7, 8]) >>> b = array([0, 2, 0, 0, 1]) >>> a[b] array([6, 8, 6, 6, 7])
C'est une façon, en utilisant numpy ndarrays:
list(np.array(A)[B])
Explication
Étant donné un ndarray numpy ( np.array (A) ), nous pouvons l'indexer en utilisant un
tableau d'entiers (qui se trouve être exactement ce que vous préférez
forme de la solution est): Le tableau d'entiers que vous utilisez pour
l'indexation dans le ndarray, n'a pas besoin d'être un autre ndarray. Il peut même
être une liste, et cela nous convient aussi, puisque B arrive à une liste. Alors,
ce que nous avons est:
np.array(A)[B]
Le résultat d'une telle indexation serait un autre ndarray, ayant le même forme (dimensions) que le tableau d'index. Donc, dans notre cas, comme nous indexons dans un ndarray en utilisant une liste d'index entiers, le résultat de cette indexation serait un ndarray unidimensionnel de la même longueur que la liste des index.
Enfin, si nous voulons convertir le résultat ci-dessus, à partir d'un
ndarray unidimensionnel dans une liste, nous pouvons le passer comme un
argument de list () :
import numpy as np
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]
C = list(np.array(A)[B]) # No need to convert B into an ndarray
# list() is for converting ndarray back into a list,
# (if that's what you finally want)
print (C)