2015-01-16 3 views
0

Я создал сетку 2D сетки w = np.meshgrid(x,y), которую я пытаюсь ввести в следующую функцию:векторизации скалярных массив умножения в Python (Numpy)

def f(w): 
    eigs = np.linalg.eigvals(A0 + w[0]*A1 + w[1]*A2) 
    return abs(eigs[0] - eigs[-1]) 

где A0, A1, A2 квадратные матрицы , Но я получаю сообщение об ошибке, которое говорит мне, что операнды нельзя транслировать вместе. В основном происходит то, что w[0]*A1 не векторизован и поэтому w[0] - это весь блок x-значений сетки вместо каждого отдельного x-значения, то же самое для w[1]*A2, но с y-значениями.

Я пробовал делать np.vectorize(func), но это не работает, и я получаю IndexError.

ответ

1

Поскольку w[0] является (n,m) массив, вы можете 'векторизовать' по

def f(w): 
    eigs = np.linalg.eigvals(A0+w[0][...,None,None]*A1 + 
     w[1[...,None,None]*A2) 
    return abs(eigs[...,0] - eigs[...,-1] 

Результат имеет ту же форму, как w[0].

Это работает, потому что внутренняя функция является линейной в x и y и eigvals принимает (..., M, M) array_like входа. В этом случае его вход будет (n,m,M,M).

+0

Спасибо, это работает, но черт возьми, я бы никогда не подумал об этом сам. – Thoth

Смежные вопросы