我怀疑我仍然不完全理解参数传递(已经在我之前的问题中:fmin(scipy)和理解python中函数的参数传递)
我在这里提出了一个简化的问题并使用了迭代,受到这篇文章的启发:How to use matplotlib toplot a function with the argument on a axis而不使用不同的 n 因为这不是我在函数中需要的。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
dataset=[0.2,0.5,0.02,0.4,0.7]
def functie_f(x,lamb_da):
return lamb_da*np.power((lamb_da*x),2)
print (functie_f(0.2,7))
def LogL(q):
lamb_da = q
return np.log(functie_f(dataset, lamb_da)).sum()
lamb_da=2
y=[functie_f(dataset,lamb_da) for i in dataset]
plt.plot(dataset,y)
print(y)
print (LogL(lamb_da))
#y2=[LogL(lamb_da) for j in dataset]
#plt.plot(dataset,y2)
这给了我这个结果:
y 的打印显示我有 5 次相同的数组,并且对于每个不同的数组有 5 次常量函数。 我预计会看到 1 个函数。我认为发生的情况是 functie_f 多次遍历同一个数据集,但如果没有迭代,它也会给出错误数量的 y 值(这就是为什么我尝试迭代为每个 x 值提供一个 y 值来自数据集。
当我也想要第二个图时(=相同的代码,但最后两行未注释掉),情况更糟,我的第一个图也消失了。
你可以在这张图片中看到:
所以我尝试省略迭代,因为这会给我太多具有相同 y 值的数组,但当我这样做时,我的 x 值和 y 值没有相同的维度。
我不明白并想纠正的地方:
以下是我的尝试,没有迭代,对于三个不同的代码具有相同的错误:
首先,我尝试简单地省略 y 的迭代:
y=functie_f(dataset,lamb_da)
plt.plot(dataset,y)
然后我尝试迭代 x(认为每 1 个 x 值需要 1 个 y 值)
for x in dataset
y=functie_f(dataset,lamb_da)
plt.plot(dataset,y)
我尝试将其写在 y 的声明下,因为它的函数中可能还包含数据集 x,但这并没有改变任何内容(我还尝试了“更新内核以强制其重新运行代码”)
y=functie_f(dataset,lamb_da)
for x in dataset
plt.plot(dataset,y)
对于上面的所有三个更改,我收到(相同的)以下错误消息:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-347b473a5e13> in <module>
19 y=functie_f(dataset,lamb_da)
20 for x in dataset:
---> 21 plt.plot(dataset,y)
22 print(y)
23
/home/marecage/snap/jupyter/common/lib/python3.7/site-packages/matplotlib/pyplot.py in plot(scalex, scaley, data, *args, **kwargs)
2767 return gca().plot(
2768 *args, scalex=scalex, scaley=scaley,
-> 2769 **({"data": data} if data is not None else {}), **kwargs)
2770
2771
/home/marecage/snap/jupyter/common/lib/python3.7/site-packages/matplotlib/axes/_axes.py in plot(self, scalex, scaley, data, *args, **kwargs)
1633 """
1634 kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D)
-> 1635 lines = [*self._get_lines(*args, data=data, **kwargs)]
1636 for line in lines:
1637 self.add_line(line)
/home/marecage/snap/jupyter/common/lib/python3.7/site-packages/matplotlib/axes/_base.py in __call__(self, data, *args, **kwargs)
310 this += args[0],
311 args = args[1:]
--> 312 yield from self._plot_args(this, kwargs)
313
314 def get_next_color(self):
/home/marecage/snap/jupyter/common/lib/python3.7/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs, return_kwargs)
496
497 if x.shape[0] != y.shape[0]:
--> 498 raise ValueError(f"x and y must have same first dimension, but "
499 f"have shapes {x.shape} and {y.shape}")
500 if x.ndim > 2 or y.ndim > 2:
ValueError: x and y must have same first dimension, but have shapes (5,) and (10,)
当
dataset
是常规 Python 列表时,lamb_da*x
是列表乘以整数,它只是重复列表 x
次。例如:
a = [1, 2, 3]
b = 2
c = a*b
print(c) # [1, 2, 3, 1, 2, 3]
您也在这一行中进行列表理解:
y = [functie_f(dataset,lamb_da) for i in dataset]
在那里,您每次都以完全相同的方式调用该函数,因此您会得到
len(dataset)
相同的结果。
您可以通过以下两种方法之一解决此问题。
import numpy as np
import matplotlib.pyplot as plt
def functie_f(x, lamb_da):
return lamb_da*np.power((lamb_da*x), 2)
lamb_da = 2
dataset = [0.2, 0.5, 0.02, 0.4, 0.7]
y = [functie_f(x, lamb_da) for x in dataset]
plt.plot(dataset, y)
dataset
转换为 numpy 数组并删除列表理解。import numpy as np
import matplotlib.pyplot as plt
def functie_f(x,lamb_da):
return lamb_da*np.power((lamb_da*x),2)
lamb_da = 2
dataset = np.array([0.2,0.5,0.02,0.4,0.7])
y = functie_f(dataset, lamb_da)
plt.plot(dataset, y)
两种方法都会给出这样的结果:
注意:该行看起来像这样(来回),因为您的
dataset
值未排序。