Просто, чтобы получить основную идею, вы можете изменить свою функцию, например, таким образом:
def func2(x, y):
x, y= x[:, None], y[None, :]
A= x+ y
A[x<= y]= (x- y)[x<= y]
return A
Таким образом, в вашем случае, что-то подобное должно быть очень разумной отправной точкой:
In []: def func(x, y):
..: x, y= x[:, None], y[None, :]
..: return x+ y
..:
In []: def func2(x, y):
..: x, y= x[:, None], y[None, :]
..: A, L= x+ y, x<= y
..: A[L]= (x- y)[L]
..: return A
..:
In []: x, y= arange(-2, 3), arange(-2, 3)
In []: func(x, y)
Out[]:
array([[-4, -3, -2, -1, 0],
[-3, -2, -1, 0, 1],
[-2, -1, 0, 1, 2],
[-1, 0, 1, 2, 3],
[ 0, 1, 2, 3, 4]])
In []: func2(x, y)
Out[]:
array([[ 0, -1, -2, -3, -4],
[-3, 0, -1, -2, -3],
[-2, -1, 0, -1, -2],
[-1, 0, 1, 0, -1],
[ 0, 1, 2, 3, 0]])
Хотя такая обработка может показаться бесполезной, это не всегда так. Всегда измеряйте фактическую производительность ваших программ и вносите затем (не ранее) необходимые изменения.
ИМХО для дополнительного преимущества: этот тип «векторизации» делает ваш код действительно непротиворечивым и читаемым.