所以基本上我试图绘制一个图表,其中我的x轴为n,而y轴为r
因此,对于n = 1,它有r = 1,n = 2它有r = 2,n = 3它有r = 4,n = 4它有8,。然后我打算扩展它。
我试过了:
import scipy
import scipy.linalg
import numpy as np
from matplotlib import pyplot as plt
for n in range(1,5):
A=np.identity(n)
for i in range(0,n):
for j in range(0,i):
A[i,j]=-1
A[:,n-1]=1
x=np.random.randn(n,1)
b=A*x
P, L, U = scipy.linalg.lu(A)
print A
r=U.max()/A.max()
print r
print n
plt.plot(n,r)
plt.show()
但它只将n的最大值与r的对应值绘制,而不是n的所有值。不确定我做错了什么。
提前致谢
答案 0 :(得分:1)
plt.plot()
可以绘制线条和标记。默认情况下,它仅绘制线条。您只提供一个点,因此不会绘制 行,并且将不会绘制。要启用标记,请设置属性marker="o"
:plt.plot(x, y, markers="o")
。
如果你想要一个折线图,你必须制作n
和r
的列表并绘制它们。
对于带有标记的列表:http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_marker
此外,您可能希望将plt.show()
从for循环中取出。它为每次迭代生成一个更新的数字,我不确定你是否想要它。
答案 1 :(得分:0)
首先需要创建要绘制的数组,然后绘制它
rr, nn = [], []
for n in range(1,5):
A=np.identity(n)
for i in range(0,n):
for j in range(0,i):
A[i,j]=-1
A[:,n-1]=1
x=np.random.randn(n,1)
b=A*x
P, L, U = scipy.linalg.lu(A)
print A
r=U.max()/A.max()
print r
print n
rr.append(r)
nn.append(n)
plt.plot(nn,rr)
plt.show()
你的方法是创建一个每个循环一个点的新图。
此外,如果您计划增加n
,我建议您检查更有效的循环方式(例如列表理解或itertools)
答案 2 :(得分:0)
我不确定这是否是你想要的(阅读你的描述,我认为是这样,但看着你的代码,看起来你正试图做一些更困难的事情。)
如果你真的想要获得序列1, 2, 4, 8, 16, ...
,我鼓励你在一个操作中处理整个数组,而不是使用for循环。它更具表现力,对大型阵列来说更快。
反正:
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>>
>>> n = np.arange(5)
>>> r = 2 ** n
>>> r
array([ 1, 2, 4, 8, 16])
>>> plt.plot(n, r, 'ob')
[<matplotlib.lines.Line2D object at 0x102d8ee10>]
>>> plt.show()