2013-03-17 47 views
1

我在尋找一種方式與numpy的實現這個Python代碼:「np.cumsum()之類」 - 迭代,實際值

N = np.arange(5) 

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

假設我其實工作的大2- D陣列(1300 * 1300)。

np.cumsum()提供了一個很好的方法,在一個軸N[0][i]N[i][0],除了它只求和原始數組的值而不是進化數組的值。

我想不出有辦法做到這一點。任何想法 ?

@Edit:

而爲了清楚起見:

帶1 d陣列環路給

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

隨着cumsum:

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

隨着2- d ,它會給出類似於:

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

你可以給一個小的二維示例,顯示輸入和所需的輸出? – 2013-03-18 00:30:59

+0

您爲2d案例提供的示例已損壞。對於二維數組,「axis」不能超過1。 – 2013-03-18 20:43:13

回答

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],什麼出來的兩個for循環的一個序列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個項目,短序列可能是60,如果你強迫使用int64的,下面的工作速度比你的for循環:

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]) 

但總的來說,我怕你會必須保持循環。