2013-03-17 4 views
1

을에 반복, 나는 NumPy와 함께 파이썬 코드의 조각을 구현하는 방법을 찾고 있어요 D 어레이 (1300 * 1300)."np.cumsum()와 같은"실제 값

np.cumsum() 좋은 방법을 제공합니다. N[0][i] 또는 N[i][0]입니다. 진화하는 배열이 아니라 원본 배열의 값만 합산한다는 점만 다릅니다.

나는 그렇게 할 방법이 없다. 어떤 아이디어?

@Edit :

명확 물건을 만들려면 : 2-D와 함께

array([ 0, 1, 3, 6, 10]) 

:

1-D 배열을 통해 루프가 cumsum와

Out[89]: array([ 0, 1, 3, 7, 15]) 

을 제공 그것은 다음과 같이 나타납니다.

N = np.arange(25).reshape(5,5) 
for i in range(len(N)): 
    N = np.cumsum(N, axis=i) 
+0

입력과 원하는 출력을 보여주는 작은 2 차원 예제를 제공 할 수 있습니까? –

+0

2d의 경우에 제공 한 예제가 손상되었습니다. 'axis '는 2 차원 배열의 경우 1보다 클 수 없습니다. –

답변

0
import numpy as np 
N = np.arange(5) 
print np.cumsum(N) # outputs [ 0 1 3 6 10] 

for i in range(5): 
    for k in range(i): 
     N[i] += N[k] 

print np.cumsum(N) # outputs [ 0 1 4 11 26] 

진화 어레이 란 무엇입니까? 당신이 당신의 루프의 결과를 작업하는 경우

2

, 시퀀스 a[n]로 시작, 어떤 루프에 대한이 나오는 것은 다음 순서 b[n]입니다 :

b[n] = a[n] + a[n-1] + 2*a[n-2] + 4*a[n-3] + ... + 2**(n-2)*a[0] = 
     a[n] + c[n-1] 

내가 정의하고있다 :

c[n-1] = a[n-1] + 2*a[n-2] + 4*a[n-3] + ... + 2**(n-2)*a[0] 

이 마지막 표현을 염두에두고, 이중 루프를 벡터화하는 방법이 있습니다. 그러나 매우 큰 요인 (2**(n-2))에 유의하십시오.이 요소를 통해 시퀀스의 항목을 곱해야합니다. 시퀀스에 양수 및 음수 용어가있는 경우이를 취소하고 합리적인 숫자를 반환 할 수 있습니다. 그러나 1000 개 이상의 양수 요소가 배열되어 있다면 numpy dtype을 오버플로 할 것입니다. 이하 30 개 항목의 짧은 시퀀스 그래서

아마도 당신이 int64 년대를 사용하여 강제로하는 경우, 다음이 루프에 대한보다 빠르게 작동 60 :

def evolving_cumsum(arr): 
    arr = np.array(arr) # makes a copy of the data 
    pows = 2**np.arange(len(arr))[::-1] 
    c = np.cumsum(arr*pows) 
    c /= pows 
    arr[1:] += c[:-1] 
    return arr 

>>> a = np.arange(10) 
>>> evolving_cumsum(a) 
array([ 0, 1, 3, 7, 15, 31, 63, 127, 255, 511]) 
>>> for i in range(len(a)): 
...  for k in range(i): 
...   a[i] += a[k] 
... 
>>> a 
array([ 0, 1, 3, 7, 15, 31, 63, 127, 255, 511]) 

을하지만, 일반적으로 당신이가는 두렵다 루프를 유지해야합니다.