Замена элемента в списке массива? - PullRequest
1 голос
/ 01 апреля 2020

У меня есть такой список:

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

, а затем я объявляю другой список:

y = [2, 8]

Как заменить элемент в первом списке, если значение равно 2 (или в индексе y [0]) с 0? И сделать то же самое во втором списке, который я должен заменить значение 8 на 0?

Таким образом, желаемый результат должен быть таким:

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

Ответы [ 5 ]

4 голосов
/ 01 апреля 2020

Вот векторизованное решение. Когда x и y являются NumPy массивами

Создайте массивы x и y NumPy. Затем используйте этот подход.

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

Полный пример:

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

Анализ времени:

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
1 голос
/ 01 апреля 2020

Следующий код заменит все значения каждого массива в x на соответствующий индекс значений в 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

Для дальнейшего использования вы используете как numpy массивы, так и * 1006. * списки, но вы называете их обоими списками. Постарайтесь не делать этого, так как это разные вещи, и это может привести к путанице, когда вы зайдете в более сложные проекты

1 голос
/ 01 апреля 2020

вы можете использовать понимание списка с np.where и встроенной функцией zip:

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

output:

[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 вернет новый массив, который вы можете отфильтровать на основе y, и измените значение, не создавая новый массив:

for a, v in zip(x, y):
    x[x==v] = 0 
0 голосов
/ 01 апреля 2020

Предполагая, что списки имеют одинаковый размер, который вы можете проверить следующим образом:

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

Вы можете выполнить l oop и проверить значения:

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 голосов
/ 01 апреля 2020

Решение:

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)

Вывод:

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

Примечания:

Обратите внимание, что сравнение поплавков может стать сложным. Если вы знаете, что вы будете сравнивать только целые числа, то лучше, по крайней мере, привести их к такому типу, или используйте некоторый пакет / модуль для их правильного сравнения (либо сравнив их разницу с очень маленькой дельтой, либо вместо этого используйте, например, поле decimal.Decimal). )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...