Функция не возвращает массив при вводе массива
Сначала опишу ситуацию: функция intence_picture строит график интенсивности электромагнитного поля заданного распределения (функции E и H). Она получает один позиционный аргумент (строка с названием графика) и словарь из 4 пунктов со значениями времени и трех пространственных координат. Половина значений - массивы, по данным которых строится график, а другие значения фиксированы. Далее выясняется, какие ключи в словаре соответствуют элементам-массивам (такие ключи заносятся в список keys_of_arrays). После этого элементы словаря, являющиеся массивами, поступают в функцию np.meshgrid. Причем в результате ее работы массивы просто перезаписываются. Затем вызывается команда plt.imshow от функции intence (которая и вычисляет интенсивность). Причем на вход ей подаются элементы словаря kwargs по ключам в том порядке, в котором стоят позиционные аргументы этой функции (сначала время t, потом массив [x, y, z]). Проблема в том, что если массивами являются позиционные аргументы x и t, то все работает нормально - функция intence выдает массив значений. Но если в словаре сделать массивами x и y, то функция intence вместо массива выдает просто число, поэтому ничего не работает. Код прилагается:
import numpy as np
import matplotlib.pyplot as plt
array_of_time = np.arange(0., 1.0*10e22, 1.0*10e20)
array_of_coord = np.arange(0., 1.0*10e13, 1.0*10e11)
c = 3e8
q = c/(4*np.pi)
def E(t, x):
E = plane_wave_E_x(t, x, ampl=0.02, omega=6, phase=0)
return E
def H(t, x):
H = plane_wave_H_x(t, x, ampl=0.02, omega=6, phase=0)
return H
def uniform_E(t, x):
return np.array([1.+x[0]*0.,0.+x[1]*0.,0.+x[2]*0.])
def uniform_H(t, x):
return np.array([0,1,0])
def plane_wave_H_x(t, x, ampl=0.02, omega=0.006, phase=3):
return np.array([0, ampl*np.cos(phase - omega*t), 0])
def plane_wave_E_x(t, x, ampl=0.02, omega=0.006, phase=0):
return np.array([0, 0, ampl*np.cos(phase - omega*t)])
def pointing_vector(t, x):
return [q*E(t,x)[1]*H(t,x)[2] - q*E(t,x)[2]*H(t,x)[1],
q*E(t,x)[2]*H(t,x)[0] - q*E(t,x)[0]*H(t,x)[2],
q*E(t,x)[0]*H(t,x)[1] - q*E(t,x)[1]*H(t,x)[0]]
def intence(t, x):
return np.sqrt(pointing_vector(t,x)[0]**2 +
pointing_vector(t,x)[1]**2 +
pointing_vector(t,x)[2]**2)
def intence_picture(title, **kwargs):
keys_of_arrays = []
for key in kwargs:
if type(kwargs[key])==np.ndarray:
keys_of_arrays.append(key)
print(keys_of_arrays)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title(title)
ax.set_xlabel(keys_of_arrays[1])
ax.set_ylabel(keys_of_arrays[0], rotation = 'horizontal')
kwargs[keys_of_arrays[1]], kwargs[keys_of_arrays[0]] = np.meshgrid(kwargs[keys_of_arrays[0]],
kwargs[keys_of_arrays[1]])
#print(kwargs['x'])
#print(kwargs['y'])
#print(kwargs['z'])
#print(kwargs['t'])
print([kwargs['x'], kwargs['y'], kwargs['z']])
print(intence(kwargs['t'], [kwargs['x'], kwargs['y'], kwargs['z']]))
#picture = ax.imshow(intence(kwargs['t'], [kwargs['x'], kwargs['y'], kwargs['z']]))
#colorbar = plt.colorbar(picture, shrink=0.92)
#name = ('D:\Выч.инф.тех\moving of particle in EM field\intence_expanded.pdf')
#plt.savefig(name)
#plt.show()
intence_picture('Интенсивность', t=0, z=0, x=array_of_coord, y=array_of_coord)