2016-11-27 1 views
1

мне нужно заменить элементы в Numpy 2D массивов на основе условии, что элемент появляется в другом replacement массивеЗаменить элементы в 2D массив на основе вхождения в другой массив

Например:

>>> main = np.random.randint(5, size=(3, 4)) 
>>> main 
array([[1, 2, 4, 2], 
    [3, 2, 3, 2], 
    [4, 4, 2, 3]]) 
>>> repl = [2,3] 
>>> main[main in repl] = -1 

Я хотел бы, чтобы все значения в repl изменяется на -1, так что я ожидаю, главный быть:

[[1, -1, 4, -1], 
[-1, -1, -1, -1], 
[4, 4, -1, -1]] 

Однако ValueError возникают при попытке иметь in в условии замены

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

ответ

1

Мы можем использовать np.in1d создать сплюснутую маску всех таких случаев и установить их в качестве -1 в уплощенном вводе, например, так -

main.ravel()[np.in1d(main, repl)] = -1 

в качестве альтернативы можно использовать np.putmask и таким образом избежать np.ravel() избежать явного уплощение, как так -

np.putmask(main, np.in1d(main, repl), -1) 
0

Вы можете сделать булеву маску и использовать его как это:

mask = np.logical_or(main == repl[0], main == repl[1]) 
main[mask] = -1 
0

Не уверен, есть ли родной numpy метод для этого, но в старой моде питоне вы можете сделать:

import numpy as np 

main = np.random.randint(5, size=(3, 4)) 
repl = [2,3] 
for k1, v1 in enumerate(main): 
    for k2, v2 in enumerate(v1): 
     if(v2 in repl): 
      main[k1][k2] = -1 
print(main) 
Смежные вопросы