Возврат одного значения из функции в Python и отображение его на тепловой карте - PullRequest
0 голосов
/ 18 апреля 2019

Я использовал следующий код для создания тепловой карты для данной функции. Здесь вычисляется глобальный показатель ляпунов для вариации логистической карты - я добавил параметр p. Там, где это хорошо, меня на самом деле не волнует, каково точное значение глобального показателя Ляпунова, а скорее, положительно оно или отрицательно.

Вот код, который я использовал:

# Logistic Function
def p_logistic(A, x, p):
    return (A/4) * (((p+1)**(p+1))/(p**p)) * (x**p) * (1-x)

# Lyapunov Exponent
def p_lyap(A, x, p):
    return np.log(abs((A/4) * (((p+1)**(p+1))/(p**p)) * (p*(x**(p-1)) - (p+1)*(x**p))))

n = 500
A = np.linspace(2, 4, n)
p = np.linspace(0.5, 5, n)

def F(A, p):
    A, p = np.meshgrid(A, p)
    lyapunov = 0
    x = 0.9
    N = 100

    for i in range(0,N):
        lyapunov = lyapunov + p_lyap(A, x, p)
        x = p_logistic(A, x, p)

    global_lyapunov = lyapunov/N
    return global_lyapunov

z = F(A, p)
plt.figure(figsize=(8,8))
xlabels = ['{:3.1f}'.format(x) for x in A]
ylabels = ['{:3.1f}'.format(y) for y in p]
ax = sns.heatmap(z, xticklabels = A, yticklabels = p)

Я пытался использовать операторы if, чтобы вернуть глобальный показатель ляпунова как 1, если он больше 0, и -1, если он меньше 0, но он вернул ошибку

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

По сути, мне бы хотелось, чтобы на моей тепловой карте было только 3 цвета, один для того, чтобы глобальный показатель ляпунов был отрицательным, равным 0 и положительным. Есть ли способ, которым это возможно?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

при условии, что я вас правильно интерпретирую, я бы просто сделал что-то вроде:

zd = np.zeros_like(z, dtype=int)
zd[z > 0] = 1
zd[z < 0] = -1

и затем график zd вместо z

также обратите внимание, что вам может быть лучше использовать imshow непосредственно из matplotlib, чтобы вы могли получить более точные метки оси, например:

plt.figure(figsize=(8,8))
plt.imshow(zd, extent=(2, 4, 5, 0.5), aspect='auto')
plt.colorbar()

imshow не выполняет никакого масштабирования значений, которые делает heatmap, что, вероятно, лучше для вашего варианта использования

также, кажется, есть много значений, которые не определены, поэтому, возможно, стоит рассмотреть их специально, например:

zd[~np.isfinite(z)] = 0

дает окончательный сюжет:

implot

но я не уверен, правильно ли я получил топоры вокруг

0 голосов
/ 19 апреля 2019

numpy.sign - это простой способ получить нужные данные.Кроме того, кажется, вы намеревались использовать xlabel и ylabel:

sns.heatmap(np.sign(z), xticklabels=xlabel, yticklabels=ylabel)
...