2017-02-06 3 views
0

두 목록 간의 평균 제곱 오차 (RMSE)를 계산하는 함수를 만들었습니다 (MSE wiki). 이를 위해서는 목록을 요소별로 뺄셈이 필요합니다. 목록 PRED (예측)과 OBS (관찰)으로, 내 첫 번째 시도는이 사용하는 것이었다 :Zip과 요소 단위 뺄셈 간의 파이썬 차이점

se = [(p-0) for p in pred for o in obs] 

을하지만 원래 목록의 길이 N으로, 길이 n의 * n의 목록에 결과. 결국, 나는

se = [(p-o) for p, o in zip(pred, obs)] 

갈 방법 이었다는 것을 발견,하지만 지금은 첫 번째 방법이 작동하지 않는 이유를 궁금합니다. 어떤 아이디어?

+2

BTW, 당신의 첫 번째 코드에 오타가있다 :'(p는-0)'나는 100 개 값 길이보다 크지 않습니다 1D 목록에서이를 사용하고 있습니다 (PO)' –

답변

2

최초 버전은 nested comprehension:pred의 모든 요소가 obs (length == n * m)으로 모든 요소와 짝을 이용한다. 한편, 우편 번호 (length == min(n, m))과 같은 요소 별 쌍으로 구성됩니다. 참아

se = [(p-0) for p in pred for o in obs] 
다음

당신은 (목록 1,리스트 2) 압축을 사용하는 루프 (중첩)에 대한 내부 루프

에 대한하지만 두 번째 시도에서 사용했다 : 당신은 두 경우 모두 list comprehension을 사용하는

0

또는 쌍 요소 현명한 모두 목록에서

zip

2

여기 뭐 그냥 인쇄 볼 수 있습니다을 문서를 봐 내가 어떻게 t 작동 :

a = [6,7,8,9] 
b = [1,2,3,4] 
print 'a = ',a 
print 'b = ',b 
print 'zipped = ', zip(a,b) #list(zip(a,b)) for Python3 
print 'Unzipped = ', [(p,o) for p in a for o in b] 

출력 :

a = [6, 7, 8, 9] 
b = [1, 2, 3, 4] 
zipped = [(6, 1), (7, 2), (8, 3), (9, 4)] 
Unzipped = [(6, 1), (6, 2), (6, 3), (6, 4), (7, 1), (7, 2), (7, 3), (7, 4), (8, 1), (8, 2), (8, 3), (8, 4), (9, 1), (9, 2), (9, 3), (9, 4)] 
1

별로 중첩 된 목록의 이해와 zip의 차이에 대한 질문에 대한 답변 - 오히려하지만 대안 -이 이미 다른 답변에 덮여 까지 사용 zip :

Numpy을 사용할 수도 있습니다. 이렇게하면 목록에서 직접 계산할 수 있습니다 (예 : pairwise 산술 연산, 매트릭스 조작 등. 이것은 또한 좋은 비트가 더 빠를 것입니다.

>>> import numpy as np 
>>> pred = np.array([10, 12, 13, 11, 15]) 
>>> obs = np.array([11, 15, 10, 10, 12]) 
>>> pred - obs 
array([-1, -3, 3, 1, 3]) 
>>> (pred - obs)**2 
array([1, 9, 9, 1, 9]) 
>>> np.mean((pred - obs)**2)**.5 
2.4083189157584592 
+0

', 그래서 내가해야 의심 할 여지없이 나는 그것이 얼마나 더 빠르다는 것에 정말로 주목할 것이다. 그러나 나는 장래에 나의 목록을 위해 np를 사용하는 것을 확실히 고려할 것이다. –

+0

@MatthijsKramer 성능이 중요하지 않더라도 'pred-obs'가'[p, o, zip (pred, obs)]'보다 훨씬 짧고 읽기 쉽다는 것을 인정해야합니다 ;-) –