我在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
库的内容。我怎么解决这个问题?
谢谢。
答案 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))
通过调用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