编写一个将bisect_left作为其一部分的函数来接受迭代输入

时间:2013-03-14 04:25:48

标签: python function matplotlib iteration range

我在python中编写了一个函数,如下所示:

from bisect import basect_left
    def find(i):
        a=[1,2,3]
        return bisect_left(a,i);

我希望此函数接受迭代作为输入并生成迭代作为输出。特别是我正在使用numpy,我希望能够使用linspace作为输入和 获取此代码的输出:

import matplotlib.pyplot as plt
t=scipy.linspace(0,10,100)
plt.plot(t,find(t))

UPDATE !!!: 我意识到我得到的错误是:

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

bisect_left来自bisect库的内容。我怎么解决这个问题? 谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码实际上是按原样运行,但是我给出了一些评论:

def sqr(i):
  return i*i;                      # you don't need the ";" here 

import matplotlib.pyplot as plt
import scipy                       # you should use "import numpy as np" here
t=scipy.linspace(0,10,100)         # this would be "np.linspace(...)" than
plt.plot(t,sqr(t))                

simple_figure.png

通过调用scipy.linspace(0,10,100),您正在创建一个numpy数组(scipy从numpy导入linspace),它内置了对矢量化计算的支持。 Numpy提供了矢量化ufuncs,如果您需要更复杂的计算,可以与indexing一起使用。 Matplolib接受numpy数组作为输入并绘制数组中的值。

以下是使用ipython作为交互式控制台的示例:

In [27]: ar = np.arange(10)

In [28]: ar
Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [29]: ar * ar
Out[29]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

In [30]: np.sin(ar)
Out[30]: 
array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
       -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])
In [31]: ar.mean()
Out[31]: 4.5

In [32]: ar[ar > 5] 
Out[32]: array([6, 7, 8, 9])

In [33]: ar[(ar > 2) & (ar < 8)].min()
Out[33]: 3

答案 1 :(得分:0)

您可以使用生成器表达式plt.plot(t, (sqr(x) for x in t))
编辑:您也可以投入使用功能:

def sqr(t):
    return (i*i for i in t);

或者您可以使用yield语句编写Generator

def sqr(t):
   for i in t:
      yield i*i