2013-11-06 2 views
4

У меня есть проблема, когда я хочу построить определитель матрицы в зависимости от параметров, поэтому у меня есть сценарийФункция meshgrid NumPy

def f(x, y): 

    DD = np.matrix([[0., 0.],[0., 0.]]) + 0.j 
    omega = x + 1.j * y 

    # set up dispersion matrix 
    DD[0,0] = 1 + omega 
    DD[1,0] = omega 
    DD[0,1] = omega 
    DD[1,1] = 1 - omega 

    metric = np.linalg.det(DD) 

    return metric 

xx = np.arange(1., 2., 0.1) 
yy = np.arange(1., 2., 0.1) 

x, y = np.meshgrid(xx, yy) 


FPlot = f(x, y) 

plt.contourf(x, y, FPlot) 
plt.show() 

Существует ошибка типа, где, так как омега является meshgrid, я не могу вставить его в матрицу или вычислить детерминант - numpy требует скаляров в матрицах. Каков наилучший способ обойти это, чтобы получить правильную сетку и оценить детерминанты?

ответ

3

Вы можете использовать np.frompyfunc:

import numpy as np 
import matplotlib.pyplot as plt 

def f(x, y): 

    DD = np.matrix([[0., 0.],[0., 0.]]) + 0.j 
    omega = x + 1.j * y 

    # set up dispersion matrix 
    DD[0,0] = 1 + omega 
    DD[1,0] = omega 
    DD[0,1] = omega 
    DD[1,1] = 1 - omega 

    metric = np.linalg.det(DD) 

    return metric 
f = np.frompyfunc(f, 2, 1) 

xx = np.arange(1., 2., 0.1) 
yy = np.arange(1., 2., 0.1) 
x, y = np.meshgrid(xx, yy) 

FPlot = f(x, y) 

plt.contourf(x, y, FPlot) # Note that this is only using the real part of FPlot 
plt.show() 

enter image description here

+0

Не видел эту функцию раньше, и фиксированный его! Благодарю. – webb

3

Если у вас есть совершенно новый NumPy 1,8, вы можете использовать одну из своих новых интересных функций: линейной алгебры gufuncs. В основном, когда вы звоните np.linalg.det, он вычисляет определитель за последние два измерений для любого массива формы вы передаете в:

xx = np.arange(1., 2., 0.1) 
yy = np.arange(1., 2., 0.1) 

x, y = np.meshgrid(xx, yy) 
omega = x + 1.j * y 

dispersion_matrices = np.empty(omega.shape + (2, 2), dtype=omega.dtype) 
dispersion_matrices[..., 0, 0] = 1 + omega 
dispersion_matrices[..., 1, 0] = omega 
dispersion_matrices[..., 0, 1] = omega 
dispersion_matrices[..., 1, 1] = 1 - omega 
FPlot = np.linalg.det(dispersion_matrices) 

plt.contourf(x, y, FPlot.imag) # the part missing in unutbus's plot! 
plt.show() 

enter image description here

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