2016-12-04 4 views
1

제공된 코드는 완벽하게 작동하지만 가능한 한 더욱 효율적으로 만들고 싶습니다.다음 코드를 더 빠르게 만들 수 있습니까?

제 질문은 배열 np_b을 더 효율적으로 생성 할 수 있는지 여부입니다. 특히, theano_f(*np_a)을 통해 np_a의 모든 요소에 대해 theano_f 함수를 계산하여 방송 (?) 또는 벡터화 (?)가 적용될 수 있습니까?

실제 문제를 단순화했으며 theano_f을 생성해야하고 sympy 함수에서 theano_function을 사용하고 실제 배열 np_a에는 수많은 요소가 들어 있습니다.

from sympy import symbols 
from sympy.printing.theanocode import theano_function 
import numpy as np 

x,y,z = symbols('x y z') 
sympy_f = x+y+z # a sympy-function which depends on 3 variables 
theano_f = theano_function([x,y,z], [sympy_f]) # Theano-compiled function which depends on 3 scalars 
np_a = np.array([[1,1,1],[2,2,2],[-1,-2,0],[0,2,0]]) 
np_b = np.array([theano_f(*x) for x in np_a]) # The obtained four numbers 
#should be recorded into the numpy-array np_b 
print(np_b) 
+0

'numpy.vectorize'는 적어도 배열에 백업으로 변환 한 후, 목록을 작성 피할 것 doc/numpy-1.10.0/reference/generated/numpy.vectorize.html을 참조하십시오. – JulienD

+0

답변 해 주셔서 감사합니다. 불행히도, 나는 아직도 그것을 작동시키는 방법을 이해하지 못합니다. 벡터화 된 함수'vectorized_f = np.vectorize (theano_f)'를 만들었습니다. 그러나'vectorized_f (* [1,1,1])'는 정상적으로 작동하지만 vectorized_f (np_a)는 TypeError를 발생시킵니다 : 필요한 입력이 없습니다. 그래서 나는 전체적인 문제가'np_a'에있는 요소를 푸는 것과 같다고 생각합니다. 이 상황에서 실제로 벡터화를 적용하는 방법을 보여줄 수 있습니까? –

답변

0

어쩌면 np.apply_along_axis 시도 : https://docs.scipy.org/ :

>>> def my_func(a): 
...  """Average first and last element of a 1-D array""" 
...  return (a[0] + a[-1]) * 0.5 
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> np.apply_along_axis(my_func, 0, b) 
array([ 4., 5., 6.]) 
>>> np.apply_along_axis(my_func, 1, b) 
array([ 2., 5., 8.]) 
+0

'apply_along_axis'는 여전히'b'의 다른 차원을 반복합니다. 그것은 편의 도구이지 속도 도구가 아닙니다. – hpaulj

+0

답변 해 주셔서 감사합니다. 불행히도,'np_b = np.apply_along_axis (theano_f, 1, np_a)'함수를 호출하려고 할 때 (내 상황에서해야 할 일이라고 생각한다.) '잘못된 차원 수 : expected 0, shape (3,)로 1을 얻었습니다.''nano_f'' 함수가 효율적으로 계산되도록 영리한 방법으로'np_a' 요소를 언팩하는 방법이 있습니까? –

+0

은 hpaulj가 말한 것처럼 속도 도구가 아니기 때문에 도움이되지 않을 것입니다. 당신은 여전히 ​​시도 할 수 있습니다. 게시 한 오류가 배열에 적용하는 차원이 잘못되었음을 의미합니다. apply_along_axis를 두 번째 인수 (축)를 1 대신 0으로 설정하여 사용해보십시오. –

관련 문제