迭代(或不迭代?)matplotlib 的参数以在 python 中绘制函数

问题描述 投票:0回答:1

我怀疑我仍然不完全理解参数传递(已经在我之前的问题中: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)

这给了我这个结果:

first result

y 的打印显示我有 5 次相同的数组,并且对于每个不同的数组有 5 次常量函数。 我预计会看到 1 个函数。我认为发生的情况是 functie_f 多次遍历同一个数据集,但如果没有迭代,它也会给出错误数量的 y 值(这就是为什么我尝试迭代为每个 x 值提供一个 y 值来自数据集。

当我也想要第二个图时(=相同的代码,但最后两行未注释掉),情况更糟,我的第一个图也消失了。

你可以在这张图片中看到:

second result

所以我尝试省略迭代,因为这会给我太多具有相同 y 值的数组,但当我这样做时,我的 x 值和 y 值没有相同的维度。

我不明白并想纠正的地方:

  1. 为什么当我从同一个数据集开始时会得到更多 y 值?
  2. 我可以为一个函数使用不同的参数吗?如何使用? (就像元组和单个值)
  3. 我为使用 functie_f 的 LogL 图传递的参数是否正确?

以下是我的尝试,没有迭代,对于三个不同的代码具有相同的错误:

首先,我尝试简单地省略 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,)
python matplotlib parameter-passing
1个回答
0
投票

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)
相同的结果。

您可以通过以下两种方法之一解决此问题。

  1. 您可以保留列表理解,但实际上循环数据集。
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)
  1. 您可以将
    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
值未排序。

© www.soinside.com 2019 - 2024. All rights reserved.