我试图将y绘制为x的函数。在每个x间隔中,函数会发生变化。我的代码如下。我最终得到一个空图。有什么想法吗?
import numpy as np
import pylab as pl
x=np.arange(0,10,11)
y=np.arange(0,10,11)
for i in range (0,len(x)):
if x>5.:
y=5.
if x>3. and x<5.:
y=x**2
if x>0. and x<3.:
y=2.
i+=1
pl.plot(x,y)
pl.xlim([-3.,7.])
pl.ylim([-3.,7.])
pl.xlabel('Social Interaction')
pl.ylabel('Color/Hue')
pl.title('Bifurcation Diagram')
pl.show()
答案 0 :(得分:0)
循环的好程序总是试图通过打印出值来执行诊断。如果你在这里这样做,你会发现x
只有一个元素。这是因为np.arange(0, 10, 11)
表示从0
开始,到10
结束,并采取11
步骤。由于11
的步骤会立即超过10
的结尾,因此x中只有一个元素,即x = array([0])
。我不确定你在这里寻找什么。
一些快速说明:你不需要在python中进行比较的小数,即x > 5
没问题,而不是x > 5.
; range
函数自动递增i
,因此您不需要i += 1
---它实际上并没有在此处执行任何操作;最后,range
和np.arange
默认从0
开始,因此您不需要包含该内容(即您可以使用np.arange(10)
代替np.arange(0,10)
}。
当您在for循环中迭代x
时,您不会查看x
和y
数组的各个元素 - 您正在查看整个阵列。如果您想一次查看单个值,则必须使用x[i]
和y[i]
对数组建立索引,这样您就可以执行以下操作:
x = np.arange(10) # this gives `array([0, 1, 2, ..., 9])`
y = np.arange(10)
for i in range (0,len(x)):
if x[i] > 5:
y[i] = 5
if x[i] > 3 and x[i] < 5:
y[i] = x[i]**2
if x[i] > 0 and x[i] < 3:
y[i] = 2
使用更高级的数组索引,您可以更快更清洁。如果你与numpy数组进行比较,它会给你一组布尔值,显示比较的真或假:
>>> x > 5
array([False, False, False, False, False, False, True, True, True, True], dtype=bool)
你也可以使用像这样的布尔数组作为另一个数组的索引,它的作用是打印布尔值为真的值,例如:
>>> x[x > 5]
array([6, 7, 8, 9])
因此,您可以使用它来设置y
您想要的方式:
>>> y[x > 5] = 5
>>> y
array([0, 1, 2, 3, 4, 5, 5, 5, 5, 5])
您可以使用布尔&
运算符来组合条件:
>>> inds = (x > 3) & (x < 5)
>>> y[inds] = x[inds]**2
>>> y
array([ 0, 1, 2, 3, 16, 5, 5, 5, 5, 5])