2013-11-15 2 views
7

numpy 배열에서 N^3 배열의 삼중 항을 사용하는 경우 배열의 모든 세 쌍에 대해 벡터 합계를 계산하려면 어떻게해야합니까? 웬일인지 나는 총계 색인 주위에 나의 두뇌를 감쌀 수 없다. 여기에 내가 뭘하려하지만, 작동하지 않는 것 :numpy의 다차원 배열의 벡터 합계

a = np.random.random((5,5,5,3)) - 0.5 
s = a.sum((0,1,2)) 
np.linalg.norm(s) 

나는 N 대형수록 합이 제대로 작동하고 있는지, 내가 0에 수렴한다는 것을 기대하지만, 난 그냥 더 큰 점점 계속. 그 합계는 올바른 모양 (3x1) 인 벡터를 제공하지만 분명히 뭔가 잘못하고있을 것입니다. 나는 이것이 쉽다는 것을 알고 있지만, 나는 그것을 얻지 못하고있다.

미리 감사드립니다.

+0

먼저 간단한 경우를보십시오 [2,4,6,8]]에서 i에 대한 선형 사례 [abs ((np.random.random (10 ** i) -0.5) .sum())를 말하십시오. 무슨 일이 일어나고 있는지 볼 수 있니? – DSM

+0

그래서, 그것의 합계가 아니라 내 테스트 케이스? (-0.5,0.5)를 넘는 N 개의 난수 세트는 N -> inf와 같이 0으로 합쳐지지 않습니다. 왜 안돼? 내 테스트가 유효하지 않은 경우 내 합계가 정확합니까? – chadh

+0

결과 합산 된 벡터의 크기를 취하고 있으며, 실수는 실수를 사용할 때 항상 양수입니다. [wiki 페이지] (http://en.wikipedia.org/wiki/Norm_ (mathematics))를 참조하십시오. [1,2,3,4]]에서 N에 대해'[(np.random.rand (10 ** N) -0.5) .sum()/10 ** N '과 같은 것을 사용하고 싶다고 생각합니다. 상대 편차의 수렴. – Daniel

답변

3

대신 균일 한 임의의 숫자의 우리가 표준 정규 번호를 사용하는 경우 분석적 당신에게 문제를 이해하기 쉽게, 그리고 질적 결과는 특정 경우에 적용 할 수 있습니다 : 지금 그래서

>>> a = np.random.normal(0, 1, size=(5, 5, 5, 3)) 
>>> s = a.sum(axis=(0, 1, 2)) 

세 각 항목을 s은 125 개의 숫자의 합계이며, 각각 표준 정규 분포에서 나온 것입니다. 2 개의 정규 분포를 더하면 평균의 합계가 평균이고 분산이 분산의 합이되는 또 다른 정규 분포가됩니다. 따라서 s의 세 값은 평균 0과 표준 편차 sqrt (125) = 11.18의 정규 분포에서 무작위 샘플로 배포됩니다.

분산의 분산이 커진다는 사실은 코드를 여러 번 실행하더라도 볼 수있는 특정 실행에서 해당 숫자 각각에 평균 0이 표시된다는 것을 의미합니다. 큰 오프셋부터

그런 다음 세 값의 표준을 계산합니다. 3 개의 표준 정규 분포를 자르고 함께 더하면 chi-squared distribution이됩니다. 그런 다음 제곱근을 취하면 chi distribution이됩니다. 전자는 다루기 쉽고이며, 당신의 세 가지 값 중 규범의 제곱의 평균 값이 3 * 125이 될 것이라고 예측 그리고 가장 확실 할 것 같다

>>> mean_norm_sq = 0 
>>> for n in xrange(1000): 
...  a = np.random.normal(0, 1, size=(5, 5, 5, 3)) 
...  s = a.sum(axis=(0, 1, 2)) 
...  mean_norm_sq += np.sum(s**2) 
... 
>>> mean_norm_sq/1000 
374.47629802482447 
+0

감사합니다. 그것은 관련된 통계에 대한 혼란을 설명합니다.통계가 더 필요합니다. stat-mech도 항상 혼란스러워합니다. 불행히도, 나는 아직도 내 합계를 정확하게하고 있는지 100 % 확신하지 못하고있다. 내 코드의 실제 목적은 난수를 합산하는 것이 아니라 저조한 잉태 단위 테스트 일뿐입니다. 나는 3d heisenberg 스핀 시스템에서 자화를 계산하고 있으므로 NxNxN의 삼중 항 배열을 사용합니다. 내 a.sum ((0,1,2)) 제 삼자의 벡터 합계를 얻는 올바른 방법은 ... 그것이 아마 당신의 대답에서 나온 것 같습니다. – chadh

3

주석 참고로 의 제곱이 인 제로에 가까워 야 할 이유가 없습니다. 설명에 따르면, N의 배열은 (N,3)이 아닌 (N,N,N,3)이 아닌 모양의 3 차원 벡터 사운드를 들려 주지만 오해의 소지가 있습니다. 어느 쪽이든,이 두 경우에 어떻게되는지 관찰 간단하다 : 당신의 직관이 예상대로

import numpy as np 

avg_sum = [] 
sq_sum = [] 

N_val = 2**np.arange(15) 
for N in N_val: 
    A = np.random.random((N,3)) - 0.5 
    avg_sum.append(A.sum(axis=1).mean()) 
    sq_sum.append ((A**2).sum(axis=1).mean()) 

import pylab as plt 
plt.plot(N_val, avg_sum, label="Average sum") 
plt.plot(N_val, sq_sum, label="Squared sum") 
plt.legend(loc="best") 
plt.show() 

enter image description here

평균 합이 0이.