2010-04-19 6 views
4

클래스 메서드 내부에있는 for 루프를 벡터화하려고합니다. for 루프는 다음과 같은 형식을 취합니다. 여러 점을 반복하며 특정 변수 (아래의 "self.condition_met")가 true인지 여부에 따라 점에서 함수 쌍을 호출하고 결과를 목록에 추가합니다 . 여기에있는 각 점은 목록의 벡터, 즉 배열 ([[1,2,3], [4,5,6], ...])처럼 보이는 데이터 구조의 요소입니다.numpy/scipy에서 for 루프를 벡터화하는 중입니까?

def myClass: 
    def my_inefficient_method(self): 
     final_vector = [] 
     # Assume 'my_vector' and 'my_other_vector' are defined numpy arrays 
     for point in all_points: 
     if not self.condition_met: 
      a = self.my_func1(point, my_vector) 
      b = self.my_func2(point, my_other_vector) 
     else: 
      a = self.my_func3(point, my_vector) 
      b = self.my_func4(point, my_other_vector) 
     c = a + b 
     final_vector.append(c) 
     # Choose random element from resulting vector 'final_vector' 

self.condition_met이 my_inefficient_method가 호출되기 전에 설정되고, 그래서 그것을 각 시간을 확인하기 위해 불필요한 것,하지만 난 더 나은이를 작성하는 방법 확실하지 않다 : 여기에 문제가있는 기능입니다. 여기서 파괴적인 작업이 없기 때문에이 전체 작업을 벡터화 된 작업으로 다시 작성할 수있는 것처럼 보입니다 - 가능합니까? 어떤 생각이 어떻게 할 수 있습니까?

답변

2

을 벡터 라이팅 할 수 있습니까? 그렇다면, 당신은

def myClass: 
    def my_efficient_method(self): 
     # Assume 'all_points', 'my_vector' and 'my_other_vector' are defined numpy arrays 
     if not self.condition_met: 
      a = self.my_func1(all_points, my_vector) 
      b = self.my_func2(all_points, my_other_vector) 
     else: 
      a = self.my_func3(all_points, my_vector) 
      b = self.my_func4(all_points, my_other_vector) 
     final_vector = a + b 
     # Choose random element from resulting vector 'final_vector' 
2

에 numpy.vectorize을 시도 할 수 있습니다 이것은 NumPy에서 몇 줄의 코드 만 사용합니다 (나머지는 데이터 세트, 몇 가지 기능 및 설정을 만드는 것입니다). 당신의 설명에서

import numpy as NP 

# create two functions 
fnx1 = lambda x : x**2 
fnx2 = lambda x : NP.sum(fnx1(x)) 

# create some data 
M = NP.random.randint(10, 99, 40).reshape(8, 5) 

# creates index array based on condition satisfaction 
# (is the sum (of that row/data point) even or odd) 
ndx = NP.where(NP.sum(M, 0) % 2 == 0) 

# only those data points that satisfy the condition (are even) 
# are passed to one function then another and the result off applying both 
# functions to each data point is stored in an array 
res = NP.apply_along_axis(fnx2, 1, M[ndx,]) 

print(res) 
# returns: [[11609 15309 15742 12406 4781]] 

내가이 흐름 추상화 : 조건 (부울)에 대한

  • 확인 '경우 진정한'는 을 만족하는 데이터 포인트 (행)에
  • 통화 쌍의 기능 조건
  • 각 집합에서 결과를 목록에 추가합니다 (아래 'res')
관련 문제