Я бы посоветовал вместо использования масок использовать логический массив для достижения желаемого.
def my_func(x):
#create a boolean matrix, a, that has True where x==0 and
#False where x!=0
a=x==0
x[a]=np.pi
#Use np.invert to flip where a is True and False so we can
#operate on the non-zero values of the array
x[~a]=x[~a]**2
return x #return the transformed array
my_array = np.array([[0.,1.,2.],[1.,0.,2.],[1.,2.,0.]])
result_array = my_func(my_array)
это дает вывод:
array([[ 3.14159265, 1. , 4. ],
[ 1. , 3.14159265, 4. ],
[ 1. , 4. , 3.14159265]])
Обратите внимание, что я специально передал функции пустой массив, изначально вы передали список, и это вызовет проблемы при попытке сделатьматематические операции.Также обратите внимание, что я определил массив с 1, а не с 1, чтобы убедиться, что это был массив с плавающей точкой, а не целые числа, потому что, если это массив целых чисел, когда вы устанавливаете значения, равные pi, он усекается до 3.
Возможно, было бы неплохо добавить кусок в функцию, чтобы проверить dtype входного аргумента и посмотреть, является ли он пустым массивом, а не списком или другим объектом, а также убедиться, что он содержит числа с плавающей запятой.и, если нет, вы можете настроить соответственно.
РЕДАКТИРОВАТЬ: перейти на использование ~ а, а не инвертировать (а) в соответствии с предложением Скотти1.