python中fit()函数_python – 函数传递给scipy.optimize.curve_fit需要满足哪些特定要求才能运行?...

你的怀疑是部分正确的. curve_fit确实将迭代传递给函数,但不仅仅是迭代:numpy.ndarray.这些碰巧拥有矢量化算术运算符,所以

a*(exp(-(x/x0))/x0)

将简单地在输入数组上以元素方式工作而没有任何错误(并且具有正确的输出).甚至没有太大的魔力:对于函数的每次评估,参数a和x0将是标量,只有x是数组.

现在,uniDist的问题在于它不仅包含算术运算符:它还包含比较运算符.只要将一个数组与标量进行比较,这些工作就可以正常工作:

>>> import numpy as np

>>> a = np.arange(5)

>>> a

array([0, 1, 2, 3, 4])

>>> a>2

array([False, False, False, True, True], dtype=bool)

上面演示了在数组和标量上使用比较运算符将再次产生元素结果.当您尝试将逻辑运算符应用于其中两个布尔数组时,会出现错误:

>>> a>2

array([False, False, False, True, True], dtype=bool)

>>> a<4

array([ True, True, True, True, False], dtype=bool)

>>> (a>2) and (a<4)

Traceback (most recent call last):

File "", line 1, in

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

错误消息有点令人困惑.它可以追溯到python会尝试为array1和array2提供单个结果的事实(在本机python中会根据它们的空虚返回任何数组).然而,numpy怀疑这不是你想要做的,而是抵制猜测的诱惑.

由于您希望函数在两个布尔数组(来自比较操作)上按元素操作,因此您必须使用&操作符.这是本机python中的“二进制和”,但是对于numpy数组,它为您提供了数组的元素“逻辑和”.您也可以使用numpy.logical_and(或者在您的情况下scipy.logical_and)更明确:

>>> (a>2) & (a<4)

array([False, False, False, True, False], dtype=bool)

>>> np.logical_and(a>2,a<4)

array([False, False, False, True, False], dtype=bool)

请注意,对于&如果你再一次使用> 2& a< 4对于程序员来说是不明确的而且是错误的(考虑你想要它做什么).由于布尔运算的“二进制和”将完全按照您的预期运行,因此可以安全地重写您的功能并使用&代替和比较两个比较. 但是,仍然需要更改一个步骤:在ndarray输入的情况下,if也会表现不同. Python无法在if中做出单一选择,如果你将数组放入其中也是如此.但你真正想要做的是限制输出元素的元素(再次).所以你要么必须遍历你的数组(不要),要么以矢量化的方式再次做这个选择.后者是使用numpy / scipy的惯用语:

import scipy as sp

def uniDist(x, a, b):

return sp.where((a<=x) & (x<=b), 1.0/(b-a), 0.0)

这(即numpy.where)将返回与x大小相同的数组.对于条件为True的元素,输出的值将为1 /(b-a).对于其余部分,输出为0.对于标量x,返回值是一个numpy标量.请注意,我在上面的示例中删除了浮点转换,因为尽管使用了python 2,但在分子中使用1.0肯定会给你真正的除法.虽然我建议使用python 3,或者至少使用from __future__ import division.

小调:即使对于标量情况,我建议使用python的运算符链进行比较,这有助于实现此目的.我的意思是你可以简单地做一个< = x< = b:...,并且与大多数语言不同,这在功能上等同于你写的(但更漂亮).

你可能感兴趣的:(python中fit()函数)