Mam taką listę:

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

A potem deklaruję kolejną listę:

y = [2, 8]

Jak mogę zamienić element na pierwszej liście, jeśli wartość jest równa 2 (lub w indeksie y [0]) przez 0? I zrób to samo na drugiej liście, którą powinienem zamienić wartość 8 na 0?

Więc pożądane wyjście powinno wyglądać następująco:

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.])]
1
Ryru Lobo 1 kwiecień 2020, 11:50

5 odpowiedzi

Najlepsza odpowiedź

Oto rozwiązanie zwektoryzowane. Gdy zarówno x, jak i y są tablicami NumPy

Twórz tablice x i y NumPy . Następnie zastosuj to podejście.

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

Kompletny przykład:

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

Analiza Timeit:

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
3
Ch3steR 1 kwiecień 2020, 09:33

Poniższy kod zastąpi wszystkie wartości każdej tablicy w x odpowiednim indeksem wartości w 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

Na przyszłość, używasz zarówno tablic numpy, jak i list Pythona, ale nazywasz je obydwoma listami. Staraj się tego nie robić, ponieważ są to różne rzeczy i może to być mylące, gdy będziesz zajmować się bardziej skomplikowanymi projektami

1
incarnadine 1 kwiecień 2020, 09:06

Możesz używać rozumienia list w np.where i wbudowana funkcja zip:

x = [np.where(a==v, 0, a)  for v, a in zip(y, x)]
x

Wynik:

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

Być trochę szybszym, ponieważ np.where zwróci nową tablicę, którą możesz przefiltrować na podstawie y i zmienić wartość bez tworzenia nowej tablicy:

for a, v in zip(x, y):
    x[x==v] = 0 
1
kederrac 1 kwiecień 2020, 09:56

Rozwiązanie:

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)

Wynik:

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

Uwagi:

Zwróć uwagę, że porównywanie pływaków może być trudne. Jeśli wiesz, że będziesz porównywać tylko liczby całkowite, najlepiej rzuć je przynajmniej jako takie lub użyj jakiegoś pakietu / modułu, aby je odpowiednio porównać (albo porównując ich różnicę z bardzo małą różnicą, albo używając pola decimal.Decimal zamiast tego, na przykład)

0
Community 20 czerwiec 2020, 09:12

Zakładając, że listy są tej samej wielkości, co możesz sprawdzić w ten sposób:

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

Możesz przeglądać i sprawdzać wartości:

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
0
Erik McKelvey 1 kwiecień 2020, 09:03