2015-11-01 5 views
0

Существует функция, которая работает с numpy.ndarray:Как получить текущее значение ndarray в функции?

def func(x): 
    print x # here I need a current value of ndarray 
    return 5*x 

Для некоторых вычислений мне нужно текущее значение передается ndarray, что-то вроде np.nditer() во время прохода.

Выход:

x = array([1, 2, 3] 
In [52]: func(x) 
[1 2 3] 
Out[52]: array([5, 10, 15]) 

Некоторые обн:

Мне нужно построить следующую последовательность:

enter image description here

Я написал функцию, которая прекрасно работает с одним значения:

In [54]: def my_formula(x): 
    ...:  return sum([1/(math.sqrt(i)) for i in range(1, x+1)] 

, но мне нужно transfom его для построения графиков:

def graph(formula, x_range): 
    x = np.array(x_range) 
    y = formula(x) # numpy ndarray! 
    plt.plot(x, y) 
    plt.show() 

так вот

return sum([1/(math.sqrt(i)) for i in range(1, x+1)] 

Мне нужен текущий элемент ndarray, а не полный диапазон для range(1, x+1)

+0

где вы хотите сохранить текущее значение переданного массива –

+4

Что вы подразумеваете под «текущим значением»? Является ли '[1,2,3]' не совсем текущим значением в вашем примере? –

+0

@ AndrasDeak 1 после этого 2 и 3 соответственно для каждого расчета. –

ответ

2

Простое преобразование вашей функции будет:

def graph(formula, x_range): 
    x = np.array(x_range) 
    y = [formula(xx) for xx in x] 
    y = np.array(y)  
    plt.plot(x, y) 
    plt.show() 

Без прокладки я могу проиллюстрировать это:

In [541]: x=np.arange(5) 
In [542]: np.array([my_formula(i) for i in x]) 
Out[542]: array([ 0.  , 1.  , 1.70710678, 2.28445705, 2.78445705]) 

Мы можем быть более сложными и говорить бит, ускоряя это, используя больше функций numpy и т. д., но это самое простое изменение, которое заставит вас идти.

+0

В ретроспективе это действительно имеет смысл :) Я просто не мог понять формулы '' '' '' '' 'и' my_formula' и еще что-то. –

0

If Я правильно понимаю, и вы хотите построить частичную сумму своей серии, тогда вы можете использовать

import numpy as np 
import matplotlib.pyplot as plt 

parsum=lambda nvect: [np.sum(1.0/np.sqrt(np.arange(1,nmax+1))) for nmax in nvect] 
x=np.arange(1,101) 
y=parsum(x) 

plt.plot(x,y) 
plt.show() 

Это будет определять lambda именем parsum, который принимает n значения, для которых он вычисляет частичную сумму до заданной n.

Если вы хотите построить последовательные значения в любом случае, вы можете просто позвонить

parsumvec=lambda nmax: [np.sum(1.0/np.sqrt(np.arange(1,n+1))) for n in np.arange(1,nmax+1)] 
y=parsumvec(101) 
x=np.arange(1,len(y)+1) 

plt.plot(x,y) 
plt.show() 

который lambda будет генерировать все частичные суммы до ее скалярного входного аргумента nmax.

Выход с nmax=101:

output

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