#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 есть функции, позволяющие избежать зацикливания в целом