2
votes

Remplacer les valeurs dans le tableau d'index correspondant à un autre tableau

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.


0 commentaires

6 Réponses :


0
votes

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]


0 commentaires

0
votes

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]


1 commentaires

Bien que votre réponse soit correcte, l'esprit: la compréhension de la liste du générateur <>.




2
votes

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)


0 commentaires

0
votes

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])


0 commentaires

1
votes

C'est une façon, en utilisant numpy ndarrays:

list(np.array(A)[B])

Explication

  1. É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]
    
  2. 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.

  3. 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)
    


0 commentaires