Наиболее эффективный способ инициализации матрицы NumPy с помощью функции координат - PullRequest
0 голосов
/ 26 января 2019

Каков наиболее эффективный способ инициализации матрицы NumPy с результатами функции, принимающей координаты в качестве аргументов?

В настоящее время я знаю, как это сделать только с двойным циклом, но я слышал, что это обычно не оптимально для матриц NumPy.

M = np.zeros((1000,1000))

for i in range(1000):
    for j in range(1000):
        M[i][j] = f(i,j) #where f is the desired function

Есть ли лучший способ реализовать матрицу NumPy с результатами произвольной функции координат?

Я предполагаю, что функция, на самом деле, зависит от двух аргументов, т.е. нет функций g и h, для которых f(x,y) = h(x)g(y). (оригинал: f(x,y) = h(g(x,y))).

1 Ответ

0 голосов
/ 27 января 2019

Существует серьезное несоответствие между вопросом и принятым ответом.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 потерпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...