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>
5 Réponses :
[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]
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)
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)
vous pouvez utiliser une compréhension de liste avec np.where et la fonction intégrée output: pour être un peu plus rapide puisque zip:for a, v in zip(x, y):
x[x==v] = 0
[array([ 0., 1., 0., 3., 4., 5., 6., 7., 8., 9., 10.]),
array([ 0., 1., 2., 3., 4., 5., 6., 7., 0., 9., 10.])]
np.where renverra un nouveau tableau que vous pourrez filtrer en fonction de y et changer la valeur sans créer de nouveau tableau: x = [np.where(a==v, 0, a) for v, a in zip(y, x)]
x
p>
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
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")
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
Bonne réponse. J'ai ajouté votre analyse du temps à ma réponse.
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