Логарифм массива в Python - PullRequest
       13

Логарифм массива в Python

0 голосов
/ 17 февраля 2012
from numpy import *
from pylab import plot,show
q=10
time = range(q)
mlist=empty(q)
nlist=empty(q)
m=.9
n=(m+(1e-6))
b=3

for t in range(q):
    mlist[t]=m
    nlist[t]=n
    m=(b*(1-m)*m)
    n=(b*(1-n)*n)

zlist = mlist-nlist
zlist = abs(zlist)
plot(time, log(zlist))
show()

тогда я хочу построить график времени, журнал (zlist)

и каждый раз, когда я запускаю программу, я получаю эту ошибку. «Участок (время, журнал (zlist)) TypeError: в скаляры Python могут быть преобразованы только массивы длины-1 "

Есть идеи, как сделать zlist не массивом, чтобы я мог взять журнал, или просто что не так в моей программе? Все остальное работает хорошо, только эта проблема. (просто обратите внимание, я импортировал pylab, numpy и math)

РЕДАКТИРОВАТЬ: значение q относительно неважно, но в идеале в конечном итоге будет в диапазоне 500-1000. и m и n должны быть между 0 и 1, а b должно быть между 0 и 4.

РЕДАКТИРОВАТЬ X2: Кажется, что теперь это работает, я не уверен, почему, но это может быть либо: а) импорт журнала из математики, либо b, проблема с отрицательным значением, но независимо от того, что она работает хорошо Спасибо всем, кто внес свой вклад!

Ответы [ 2 ]

6 голосов
/ 17 февраля 2012

Я подозреваю, что вы сделали from math import * после from numpy import *, что означает, что log действительно math.log, который не будет работать с массивом.

Вы действительно не должны использовать import * в скриптах. Вместо этого вы должны сделать

import numpy as np
import matplotlib.pyplot as plt

q=10
time = np.arange(q)
mlist = np.empty(q)
nlist = np.empty(q)
m=.9
n=(m+(10e-6))
b=3

for t in range(q):
  mlist[t]=m
  nlist[t]=n
  m *=b*(1-m)
  n *=b*(1-n)

zlist = mlist-nlist

plt.plot(time, np.log(zlist))

или лучше

plt.semilogy(time, zlist)
0 голосов
/ 17 февраля 2012

Попробуйте

plot(time, map(log, zlist))

Это будет применять функцию журнала к каждому номеру в zlist.

...