0

我在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))

更新!!!:我意识到我得到的错误是:

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

这是bisect_leftbisect图书馆给出的。我怎么解决这个问题?谢谢你。

4

2 回答 2

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,您可以将其与索引一起使用。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
于 2013-03-14T06:43:41.213 回答
0

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

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

或者你可以编写一个带有 yield 语句的生成器:

def sqr(t):
   for i in t:
      yield i*i
于 2013-03-14T04:32:52.233 回答