Замените совпадающие элементы в двух массивах разными значениями, используя циклы for и условия if в python 3

#python #arrays #python-3.x #loops

#python #массивы #python-3.x #циклы

Вопрос:

У меня есть два массива:

 import numpy as np

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

Я хотел бы заменить элементы a на -3, если те же элементы появляются в b . Я хотел бы сделать это с помощью цикла for с условием if / без него. Вот что у меня есть:

 for i in range(len(a)):
    if a[i] == b[i]:
       a[i] == -3

        
              
print(a) 
  

И я получаю эту ошибку:

 IndexError                                Traceback (most recent call last)
<ipython-input-19-5f8874f38b74> in <module>()
      7 
      8 for i in range(len(a)):
----> 9     if a[i] == b[i]:
     10        a[i] == -3
     11 

IndexError: index 4 is out of bounds for axis 0 with size 4
  

Насколько я понимаю, это несоответствие размера. Есть ли способ решить мою проблему с массивами разных размеров?

Комментарии:

1. должны ли это быть массивы numpy? не списки?

2. Если i=4 что должно b[i] вернуться? Предполагая, secondArray что есть b , то есть. PythonTutor — отличный инструмент для подобных вопросов.

3. in Оператор позволяет проверить, есть ли элемент в списке.

4. Вам действительно не следует использовать numpy здесь, если вы собираетесь сделать это таким образом. В numpy вы бы a[np.in1d(a,b)] = -3 просто использовали списки, если вы на самом деле не собираетесь использовать numpy

Ответ №1:

Другие указывали, что реальная проблема заключается в том, что вы не можете проверить членство, прокручивая оба массива одновременно. in Хорошей альтернативой является использование оператора Python.

Однако, если мы в Numpy, мы можем использовать поэлементную версию Numpy того же самого:

 a[np.isin(a, b)] = -3
  

np.isin(a,b) возвращает логический ndarray, указывающий, был ли каждый элемент a в b, который мы можем использовать для индексации a и устанавливать только значения, которые были в b, на -3.

Ответ №2:

Вы используете индексы from a для доступа к элементам from b , что намного короче. Вы быстро превышаете длину b и сталкиваетесь с ошибкой. Рекомендуем вам попробовать следующее:

 import numpy as np

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

for i,v in enumerate(a):
    if v in b:
        a[i] = -3
       
print(a) 
  

Out:

 [-3  1 -3  3  4 -3  6  7 -3  9]
  

Подробное объяснение этого поведения может занять немного больше места, чем я хочу здесь заполнить, но здесь есть довольно хороший учебник, который поможет вам разобраться с использованием lists s в Python.

Комментарии:

1. Спасибо, Джеймс, это сработало! Я проверю учебник для дальнейшего понимания.

Ответ №3:

Для python будет работать следующее list . Это не решение на основе numpy

 a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b=[8,2,5,0]
common=set(a).intersection(b) # {8, 0, 2, 5}
for i in range(len(a)):
    if a[i] in common:
        a[i]=-3
print(a) # [-3, 1, -3, 3, 4, -3, 6, 7, -3, 9]
  

Комментарии:

1. np.array Также работает с.

2. о, я не знал, не пользователь numpy, но я предполагаю, что у numpy есть функции, позволяющие избежать зацикливания в целом