Разработка поверхности matplotlib из вложенного словаря - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть структура данных, сгенерированная из следующего (где [a] func1 и func2 являются функциями-заполнителями, а [b] i1 и т. Д. Являются значениями переменных-заполнителей):

def func1(x,y,z):
    return x+y/z

def func2(x,y,z):
    return x/y+z

var1 = [i1, i2, ..., i]
var2 = [j1, j2, ..., j]
var3 = [k1, k2, ..., k]

data_bin = {}

for i in var1:
    data_bin[i] = {}

    for j in var2:
        data_bin[i][j] = {}

        for k in var3:
            data_bin[i][j][k] = [func1(i,j,k), func2(i,j,k)]

Что дает структуру данных примерно так:

{i1 : {j1 : {k1 : [func1_val, func2_val], ...}, ...}, ...}

И я пытаюсь создать такие графики (псевдокод)

for given i1:
    x-axis = j
    y-axis = k
    z-axis = func1_val

или

for given k1:
    x-axis = i
    y-axis = j
    z-axis = func2_val

Как мне пройтись по циклу по словарю, чтобы извлечь эти значения в рабочие бины для использования в matplotlib или что-то в этом роде?

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Стандартный способ построения графика matplotlib - это данные, хранящиеся в массиве numpy.

В этом случае для примера вы можете определить сетку:

mesh1, mesh2, mesh3 = np.meshgrid(var1, var2, var3)

, который определит 3 трехмерных массива, которые могут быть использованы в качестве входных данных для графика поверхности matplotlib.

Тогда функция может быть вызвана без циклов, и операции будут выполняться поэлементно напрямую. т.е.

res1 = func1(mesh1,  mesh2, mesh3) 

И в конечном итоге сделать графики с кодом, похожим на этот псевдокод:

for i in var1:
    plt.plot_surface(mesh2[i,:,:], mesh3[i,:,:], res1[i,:,:]) 

Однако в случае очень больших массивов создание 3d-сетки может быть слишком трудоемким. Поэтому, может быть, лучше построить 2-мерные сетки и перебрать третий. Одним из примеров этого будет:

mesh2, mesh3 = np.meshgrid(var2, var3) # it can be defined outside because only var1 varies during the loop
for i in var1:
    res1 = func1(i,mesh2,mesh3)
    plt.plot_surface(mesh2, mesh3, res1) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...