Массивы Numpy: множественное условное назначение

#python #numpy

Вопрос:

У меня есть два массива Numpy следующим образом:

 >>> x
array([[0, 3, 3],
       [3, 3, 3],
       [0, 3, 3]])
>>> y
array([[0, 0, 0],
       [0, 2, 2],
       [0, 2, 2]])

 

Сравнивая x и y , я хотел бы, чтобы результат сравнения присваивал значения на основе следующих условий:

  1. Если значения x и y не равны нулю, назначьте меньшее значение
  2. Если x или y равно нулю, назначьте ненулевое значение
  3. Если x и y равно нулю, назначьте 0

Поэтому, ссылаясь на приведенный выше пример, я хотел бы, чтобы результат был:

 >>> result
array([[0, 3, 3],
       [3, 2, 2],
       [0, 2, 2]])
 

Примечание: размер массива является переменным. Я взял 3 x 3 массив только в качестве примера. x и y все же будут такого же размера.

Как я могу выполнить эту операцию замены/назначения с помощью Numpy?

Ответ №1:

Вы можете использовать встроенный выбор для замены нескольких условий:

 np.select([(x!=0)amp;(y!=0), (x==0)!=(y==0), (x==0)amp;(y==0)],[np.minimum(x,y), x y, 0])
 

выход:

 array([[0, 3, 3],
       [3, 2, 2],
       [0, 2, 2]])
 

хотя вы можете перевести это множественное условие в одно условие и использовать дополнение для двух последних условий с одинаковым выводом:

 np.where((x!=0)amp;(y!=0), np.minimum(x,y), x y)
 

Ответ №2:

Вот решение:

 tmp = np.where(x == 0, y, x) # Rule 2 and 3
result = np.where((x != 0) amp; (y != 0), np.minimum(x, y), tmp) # Rule 1
 

Вывод в result :

 array([[0, 3, 3],
       [3, 2, 2],
       [0, 2, 2]])