2017-03-02 1 views
1

더 많은 데이터를 분석하고 해결하기 위해 매트릭스에 추가하려고합니다. 그러나 현재는 짐승 같은 연산을 수행하고 있기 때문에 분석에 다른 열을 추가하면 파이썬의 한계를 초과합니다. 콤비네이션을 통해 야만적 인 방법을 사용하는 것보다 비슷한 결과를 얻을 수있는 솔버 방법이 있습니까? sample.csv도 아래에 나열되어 있습니다. 어떤 조언을 주셔서 감사합니다.파이썬, 솔버 메소드 또는 현재 코드의 최적화?

import csv 
import itertools as it 
import numpy as np 

C = 2618.08 
B = 933.15 
A = 932.37 
adjust = 1 


D = csv.reader(open('sample.csv')) 

float_ABC = [] 
OUT = np.zeros((3, 9)) - 100 

for row in D: 
     float_ABC.append([str(x) for x in row]) 

float_ABC = float_ABC.astype(np.float) 

Alpha=float_ABC[:, [0,3,6,9,12,15]] 
Beta=float_ABC[:, [2,5,8,11,14,17]] 
Phi=float_ABC[:, [1,4,7,10,13,16]] 

plines1 = it.product(Alpha[0],Alpha[1],Alpha[2],Alpha[3], 
        Alpha[4],Alpha[5],Alpha[6],Alpha[7], 
        Alpha[8]) 

plines2 = it.product(Beta[0],Beta[1],Beta[2],Beta[3], 
        Beta[4],Beta[5],Beta[6],Beta[7], 
        Beta[8]) 

plines3 = it.product(Phi[0],Phi[1],Phi[2],Phi[3], 
        Phi[4],Phi[5],Phi[6],Phi[7], 
        Phi[8]) 


for count in range(0,6**9): 
    sumA = next(plines1) 
    sumB = next(plines2) 
    sumC = next(plines3) 

    if (sum(sumC)+B)/(sum(sumA)+C) <= (B+adjust)/(C) and \ 
     (sum(sumC)+B)/(sum(sumA)+C) >= (B+adjust-10)/(C) and \ 
     (sum(sumB)+A)/(sum(sumA)+C) > (sum(OUT[2])+A)/(sum(OUT[0])+C): 
     print("#",count,"- new option found!") 
     OUT = np.vstack((sumA,sumC,sumB)) 

및 sample.csv :

13.4,-18.81,-24.75,5.82,-8.21,-10.8,0,0,0,3.3,1.56,2.05,-2.1,5.36,7.05,2.6,5.65,7.44 
0,-11.01,-14.49,0,-4.87,-6.41,0,0,0,0.6,2.24,2.95,1,4,5.26,1.7,2.73,3.59 
0,-40.74,-53.6,0,-17.86,-23.5,0,0,0,3.5,6.53,8.59,2.9,9.36,12.31,1.9,2.61,3.44 
1000,-1000,-1000,0,0,0,20.76,21.78,15.66,18.48,23.44,16.96,27.72,26.46,19.92,32.28,29.58,23.08 
1000,-1000,-1000,-2.28,-6.12,-4.16,-2.28,-2.53,-1.73,0,0,0,1.92,-1.85,-1.26,1.08,-1.27,-0.86 
1000,-1000,-1000,0,0,0,6.78,7.38,5.07,6.66,8.93,6.14,8.46,8.41,5.78,9.42,10.37,7.14 
1000,-1000,-1000,0,0,0,28.8,34.28,27.86,37.2,39.64,33.32,45.6,42.76,36.63,54,45.88,40.03 
1000,-1000,-1000,0,-4.95,-3.36,0,0,0,1.8,0.59,0.4,1.2,1.85,1.27,3.72,0.17,0.11 
1000,-1000,-1000,0,0,0,27.6,19.3,13.71,32.76,23.68,17.15,37.8,20.56,14.71,22.56,27.58,21.06 
+1

는 "이 파이썬의 한계를 초과하는"무엇을 의미합니까? 어떤 종류의 오류가 있습니까? 열거 (zip (plines1, plines2, plines3))에서'for count, (sumA, sumB, sumC)를 사용하는 것이 좋습니다 :'sum (sumA) + C' 등의 결과를 캐싱하는 것은 여러 번 다시 계산하기 때문에 가능합니다. 모든 반복. –

+1

위의 코드는 위의 코드에서'AttributeError : 'list'객체가'float_ABC'가 목록이므로'float_ABC = float_ABC.astype (np.float)'줄에 'astype'속성이 없다고 기대할 것입니다 ... –

+0

thanks 입력을위한 @ TadhgMcDonald-Jensen - 열거 형 (zip (plines1, plines2, plines3))에서 count, (sumA, sumB, sumC)에 대한 행 : '어떤 이유로 든 내 두뇌에 연결되지 않았고 그 내 분석의 다른 부분에서 - 그건 의미가 있습니다. float_ABC 라인에 관해서는, 그것은 엔트리의 일부를 문자열로 가져 왔기 때문에 모든 것을 float 객체로 변환합니다. 그래도 그 도움에 대해 매우 감사하게 생각합니다! –

답변

0

이 답변은 다음 알고리즘을 사용하여 도움이 더 codereview 같은 질문을 치료한다.

먼저 할 수 iterate over all three plines1 at the same time using zip

for sumA, sumB, sumC in zip(plines1, plines2, plines3): 
    pass 

하지만 enumerate을 사용할 수 있습니다에 당신이 단계의 실행 수를 얻을 수 있습니다 :

for count, (sumA, sumB, sumC) in enumerate(zip(plines1, plines2, plines3)): 
    pass 

을 나는 또한 당신이 (B+adjust)/(C)(B+adjust-10)/(C) 모든 반복을 다시 계산주의 어느 부분도 루프에서 전혀 변경되지 않으므로 모든 반복 대신 루프 앞에 한 번만 계산하면 실행 시간이 절약됩니다.

high_check = (B+adjust)/(C) 
low_check = (B+adjust-10)/(C) 

for count, (sumA, sumB, sumC) in enumerate(zip(plines1, plines2, plines3)): 

    if (low_check <= (sum(sumC)+B)/(sum(sumA)+C) <= high_check 
      and <OTHER CHECK>): 
     ... 

sum(sumA)를 산출 (및 sumB, sumC 용) sumA 값 터플을 나타내므로 unecessarily 비싸고 다소 혼란을 반복해서, 그것을 한번 합을 계산하는 것이 더 이해하고 걸릴 것 matrix라는 하나 개의 값으로 튜플 (sumA, sumB, sumC)OUT 변화가 변하지 않는 값을 다시 계산하는 데 필요한 실행 시간을 줄일 경우에만

for count, matrix in enumerate(zip(plines1, plines2, plines3)): 
    sumA, sumB, sumC = map(sum, matrix) 
    if (low_check <= (sumC+B)/(sumA+C) <= high_check 
      and <OTHER CHECK>): 
     ... 
     OUT = np.vstack(matrix) 

유사에만 (sum(OUT[2])+A)/(sum(OUT[0])+C)을 재 계산 (2D 튜플은 충분히 가까운) :

OUT_check = (sum(OUT[2])+A)/(sum(OUT[0])+C) 

for ... in ...: 

    if ( ... 
      and (sumB+A)/(sumA+C) > OUT_check): 
     ... 
     OUT_check = (sum(OUT[2])+A)/(sum(OUT[0])+C) 

이렇게 변경된 코드의 섹션은 다음과 같을 것이다 :

plines1 = it.product(*Alpha) #star notation just unpacks all the elements into arguments 
plines2 = it.product(*Beta) 
plines3 = it.product(*Phi) 

high_check = (B+adjust)/(C) 
low_check = (B+adjust-10)/(C) 
OUT_check = (sum(OUT[2])+A)/(sum(OUT[0])+C) 

for count, matrix in enumerate(zip(plines1, plines2, plines3)): 
    sumA, sumB, sumC = map(sum, matrix) 
    if (low_check <= (sumC+B)/(sumA+C) <= high_check 
      and (sumB+A)/(sumA+C) > OUT_check): 
     print("#",count,"- new option found!") 
     OUT = np.vstack(matrix) 
     OUT_check = (sum(OUT[2])+A)/(sum(OUT[0])+C) 
+0

코드를 열거하고 내가 할 수있는 부분을 캐싱하도록 변경했습니다. 현재 알고리즘에서 주어진 시간을 절약 할 수 있습니다. 현재 알고리즘의 최적화 덕분에. 나는 시간을 더 향상시킬 것을 요구하고있다. 분석 할 데이터의 컬럼을 더 추가 할 수 있도록 시간을 더욱 향상시킬 수있는 솔버 알고리즘이 있다면? 필자의 궁극적 인 목표는 sample.csv를 사용하여 15 개 항목을 각 튜플에 9 개가 아닌 9 개 항목으로 가져 오는 것입니다. 'scipy'알고리즘을 사용하여이 작업을 수행 할 수 있습니까?모든 선을 반복하기 전에 '최적화'할 것인가? –

+0

필자는 그러한 종류의 기능을 실제로 사용하지 않았기 때문에 미안합니다. –