Существует серьезное несоответствие между вопросом и принятым ответом.fun
не является произвольной функцией координат.Это полностью «векторизованный», который принимает транслируемые массивы.
In [195]: def fun(i,j): return i*j-j**2
In [196]:
In [196]: np.fromfunction(fun, (4,4))
Out[196]:
array([[ 0., -1., -4., -9.],
[ 0., 0., -2., -6.],
[ 0., 1., 0., -3.],
[ 0., 2., 2., 0.]])
In [197]: fun(np.arange(4)[:,None], np.arange(4))
Out[197]:
array([[ 0, -1, -4, -9],
[ 0, 0, -2, -6],
[ 0, 1, 0, -3],
[ 0, 2, 2, 0]])
Все, что fromfunction
делает, это генерирует полный набор координат и передает полученный массив (ы) в вашу функцию:
In [199]: np.indices((4,4))
Out[199]:
array([[[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]]])
np.meshgrid
и np.mgrid
также могут быть использованы для генерации этих координат.Функция, которая работает с 2d массивами, подобна этой, не является произвольной.Тем не менее, это очень желательная черта при работе с numpy
.
Ваш вопрос, или, возможно, отсутствие ответа на наши вопросы, подразумевает, что i
и j
должны быть скалярными,и, следовательно, требует, чтобы каждая пара i,j
передавалась функции индивидуально.Например, j
может использоваться в math.sin(j)
, или у функции есть некоторый if
тест для значения i
или j
.В этом случае подход fromfunction
потерпит неудачу.