1
votes

Remplacement d'un élément dans une liste de tableau?

J'ai une liste comme celle-ci:

x = [array([ 0.,  1.,  0.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]),
     array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  0.,  9., 10.])]

puis je déclare une autre liste:

y = [2, 8]

Comment puis-je remplacer un élément dans la première liste si la valeur est égale à 2 (ou en index de y [0]) avec 0? Et faire la même chose sur la deuxième liste, que je devrais remplacer la valeur 8 par 0?

La sortie souhaitée devrait donc être comme ceci:

x = [array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]),
     array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])]

p>


0 commentaires

5 Réponses :


0
votes

Solution:
[0.0, 1.0, 0.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 0.0, 9.0, 10.0]

Sortie :

x = [[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
     [ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]]
     
y = [2, 8]

for i, array in enumerate(x):
    for j, number in enumerate(array):
        if number == y[i]:  # this might fail for floats
            array[j] = 0.0
    print(array)

Notes:

Notez que la comparaison de flottants peut devenir délicate. Si vous savez que vous ne comparerez que des entiers, mieux vaut les convertir en tant que tels au moins, ou utiliser un package / module pour les comparer correctement (soit en comparant leur différence à un très petit delta, soit en utilisant decimal.Decimal code> à la place, par exemple)


0 commentaires

1
votes

3 commentaires

Sans lancer, cela peut être utilisé. Bonne réponse. + 1


Je timeit la réponse de Sam plus vite que la compréhension de la liste peut être le coupable est np.where . Je chronométrerai votre réponse en utilisant == au lieu de np.where .


@ Ch3steR sam effectue des remplacements sur place, np.where renvoie un nouveau tableau



0
votes

En supposant que les listes sont de la même taille, ce que vous pouvez vérifier comme ceci:

for i in range(len(x)):        # For each array in x
    for j in range(len(x[i])): # For each item in the array
        if x[i][j] == y[i]:    # If the item is equal to the value you are searching
            x[i][j] = 0

Vous pouvez parcourir et vérifier les valeurs:

if len(x) == len(y):
    print("Lists are the same size")


0 commentaires

1
votes

Le code suivant remplacera toutes les valeurs de chaque tableau de x par l'index correspondant des valeurs de y.

import numpy as np

x = [np.array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]),
     np.array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])]

y = [2, 8]

for i in range(len(x)):
  arr = x[i]
  arr[arr == y[i]] = 0

Pour une note ultérieure, vous utilisez à la fois des tableaux numpy et des listes python , mais vous les appelez les deux listes. Essayez de ne pas faire cela car ce sont des choses différentes et cela peut devenir déroutant lorsque vous vous lancez dans des projets plus compliqués


1 commentaires

Bonne réponse. J'ai ajouté votre analyse du temps à ma réponse.



3
votes

Voici une solution vectorisée. Lorsque x et y sont des tableaux NumPy

Créez votre code x et y > Tableaux NumPy . Utilisez ensuite cette approche.

In [50]: timeit x[x==y[:,None]]=0 #My solution
2.2 µs ± 34.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [53]: timeit [np.where(a==v, 0, a)  for v, a in zip(y, x)] #kederrac's solution
10.6 µs ± 309 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [54]: %%timeit
    ...: x = [np.array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]),
    ...:      np.array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])]
    ...: y = [2, 8]
    ...: for i in range(len(x)):
    ...:   arr = x[i]
    ...:   arr[arr == y[i]] = 0
    ...:
6.61 µs ± 310 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) #Sam's solution

Exemple complet:

x=np.array([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
            [ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  0.,  9., 10.]])
y=np.array([2,8])

x[x==y[:,None]]=0

#array([[ 0.,  1.,  0.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
#       [ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  0.,  9., 10.]])

Analyse Timeit:

x[x==y[:,None]]=0


0 commentaires