我遇到了一个奇怪的问题:当我将非线性方程中的大量数据点存储到3个数组(x,y和z)时,然后尝试将它们绘制在2D图形中(theta-phi图,因此它的2D)。
我试图通过每20个数据点的采样点消除需要绘制的点,因为z数据大致是周期性的。我选择z值刚好大于零的那些点,以确保我为每个时期选择了一个点。
当我尝试执行上述操作时出现问题。我在图表上只得到了非常有限的点数,大约152个点,无论我如何改变我的初始数据点数(只要它超过一定数量的当然)。
我怀疑它可能是我错误使用的某个命令,或者数组的容量小于我预期的(似乎不太可能),有人可以帮我找出问题所在吗?
def drawstaticplot(m,n, d_n, n_o):
counter=0
for i in range(0,m):
n=vector.rungekutta1(n, d_n)
d_n=vector.rungekutta2(n, d_n, i)
x1 = n[0]
y1 = n[1]
z1 = n[2]
if i%20==0:
xarray.append(x1)
yarray.append(y1)
zarray.append(z1)
for j in range(0,(m/20)-20):
if (((zarray[j]-n_o)>0) and ((zarray[j+1]-n_o)<0)):
counter= counter +1
print zarray[j]-n_o,counter
plotthetaphi(xarray[j],yarray[j],zarray[j])
def plotthetaphi(x,y,z):
phi= math.acos(z/math.sqrt(x**2+y**2+z**2))
theta = math.acos(x/math.sqrt(x**2 + y**2))
plot(theta, phi,'.',color='red')
此外,我尝试将以下SO question中的代码应用到我的代码中,除了我的数据点不是随机生成外,我想要一个非常相似的结果。
答案 0 :(得分:2)
Shiuan,
我仍在调查你的问题,但有几点说明:
您可以执行以下操作,而不是循环并附加到数组:
# inside IPython console:
[2]: a=np.arange(0,10)
In [3]: a[::2] # here we select every 2nd element.
Out[3]: array([0, 2, 4, 6, 8])
所以不要在m:
的所有元素上计算runga-kuttanew_m = m[::20] # select every element of m.
现在调用你的函数:
def drawstaticplot(new_m,n, d_n, n_o):
n=vector.rungekutta1(n, d_n)
d_n=vector.rungekutta2(n, d_n, i)
x1 = n[0]
y1 = n[1]
z1 = n[2]
xarray.append(x1)
yarray.append(y1)
zarray.append(z1)
...
append
通常很慢,因为它会复制整个数组然后
堆叠新元素。相反,你已经知道了n的大小,所以你可以这样做:
def drawstaticplot(new_m,n, d_n, n_o):
# create the storage based on n,
# notice i assumed that rungekutta, returns n the size of new_m,
# but you can change it.
x,y,z = np.zeros(n.shape[0]),np.zeros(n.shape[0]), np.zeros(n.shape[0])
for idx, itme in enumerate(new_m): # notice the function enumerate, make it your friend!
n=vector.rungekutta1(n, d_n)
d_n=vector.rungekutta2(n, d_n, ite,)
x1 = n[0]
y1 = n[1]
z1 = n[2]
#if i%20==0: # we don't need to check for the 20th element, m is already filtered...
xarray[idx] = n[0]
yarray[idx] = n[1]
zarray[idx] = n[2]
# is the second loop necessary?
if (((zarray[idx]-n_o)>0) and ((zarray[j+1]-n_o)<0)):
print zarray[idx]-n_o,counter
plotthetaphi(xarray[idx],yarray[idx],zarray[idx])
答案 1 :(得分:0)
您可以使用此处建议的方法: Efficiently create a density plot for high-density regions, points for sparse regions 例如直方图,你有太多的点和密度低的点。 或者你也可以使用rartized标志为matplotlib,这会加速matplotlib。