2013-03-14 3 views
0

Я написал функцию в Python следующим образом:Дать функцию, которая bisect_left как часть его принять итерационные входы

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

Вы можете использовать выражение генератор plt.plot(t, (sqr(x) for x in t))
EDIT: Вы можете поместить в в функции, а также:

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

Или вы можете написать Generator с утверждением выхода:

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

Спасибо, но я все равно хочу так, что функции питона написаны для его реализации в рамках функции не делать этого в сюжете – Cupitor

+0

@Naji отредактировал ответ – Igonato

+0

-1, поскольку OP называет массив numpy с 'scipy.linspace', поэтому вам не нужны никакие итерационные или генераторные выражения, но вместо этого вы можете использовать встроенные функции. – bmu

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 импорт LINSPACE из NumPy), который имеет встроенную поддержку для векторизованных расчетов. 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 
+0

На самом деле в моем реальном коде я использовал np. Здесь, когда я приводил пример, я забыл об этом, но большое спасибо. Но все равно это не работает, и это ошибка, которую я получаю: ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте a.any() или a.all() – Cupitor

+0

OH! Я просто понял, почему эта ошибка возникает, и это из-за bisec_left в моем коде! – Cupitor

+0

Я отредактировал свой вопрос в соответствии с новой информацией, но спасибо еще раз – Cupitor

Смежные вопросы