2016-11-21 94 views
2

我有一個大數組,下面的小示例中顯示了其中的一部分。 在每個列表中,第一個數字是開始,第二個數字是結束 (所以有一個範圍),但每個元素是序列的一部分,每個序列從零開始。 。我想要做的是:numpy array中的拆分元素

小例子:

array([[ 469, 1300], 
     [ 171, 1440], 
     [ 187, 1564], 
     [ 204, 1740], 
     [ 40, 1363], 
     [ 56, 1457], 
     [ 132, 606], 
     [1175, 2096], 
     [ 484, 2839], 
     [ 132, 4572], 
     [ 166, 1693], 
     [ 69, 3300], 
     [ 142, 1003], 
     [2118, 2118], 
     [ 715, 1687], 
     [ 301, 1006], 
     [ 48, 2142], 
     [ 63, 330], 
     [ 479, 2411]], dtype=uint32) 

我想從其中索引的每個序列的開頭取0 (不包括在範圍內) 開始前,直到-20每個範圍。

我試過這段代碼:

cds = np.column_stack([cdspos[:, 0] - cdspos[:, 0], cdspos[:, 0] - 20]) 

,但它給出了這樣的錯誤:

y = _nx.arange(0, num, dtype=dt) 
MemoryError 

但我試試這個:

cds = np.column_stack([cdspos[:, 0] - 100, cdspos[:, 0] - 20]) 

它完美的作品。問題是我在起點之前沒有相同的範圍 (全部不是100)。

所以,我想要得到一個更小的範圍(列表),像這樣:(0)到 (start-20)。例如第一個元素會是這樣:

[ 0, 449] 

我也試過

cds = np.column_stack([0, cdspos[:, 0] - 20]) 

,但沒有奏效。

的小例子,我找的輸出會是這樣:

array([[0, 449], 
     [0, 151], 
     [0, 167], 
     [0, 184], 
     [0, 20], 
     [0, 36], 
     [0, 112], 
     [0, 1155], 
     [0, 464], 
     [0, 112], 
     [0, 146], 
     [0, 49], 
     [0, 122], 
     [0, 2098], 
     [0, 695], 
     [0, 281], 
     [0, 28], 
     [0, 43], 
     [0, 459]], dtype=uint32) 

你們怎麼知道該怎麼做?

+0

我想這和完美工作:CDS1 = np.column_stack([np.zeros(LEN(cdspos),D類= 「UINT32」),cdspos [: ,1]]) – user3631908

回答

0

這裏有一種方法:

In [22]: np.column_stack((np.zeros(a.shape[0], dtype=np.int8), (a[:,0]- 20).astype(np.int16))) 
Out[22]: 
array([[ 0, 449], 
     [ 0, 151], 
     [ 0, 167], 
     [ 0, 184], 
     [ 0, 20], 
     [ 0, 36], 
     [ 0, 112], 
     [ 0, 1155], 
     [ 0, 464], 
     [ 0, 112], 
     [ 0, 146], 
     [ 0, 49], 
     [ 0, 122], 
     [ 0, 2098], 
     [ 0, 695], 
     [ 0, 281], 
     [ 0, 28], 
     [ 0, 43], 
     [ 0, 459]], dtype=int16) 

注意,在這種情況下,我用np.int8的零和np.int16(或使用np.uint32,如果您的號碼是大是適合於int16)的第二列數字。如果你再次出現內存錯誤,這意味着你不能一次性在你的RAM中保存你的數組。您可以將陣列分成多個部分,並分別在不同的部分應用這些操作,並分別處理它們。如果這是不可能的

+0

再次我得到這個錯誤:y = _nx.arange(0,num,dtype = dt) MemoryError – user3631908

+0

@ user3631908在這種情況下,您可以手動指定類型,我認爲這會有所幫助。嘗試更新。 – Kasramvd

+0

現在的錯誤是:ValueError:樣本數-1,必須是非負數。 – user3631908

0

什麼

In [17]: numpy.array([[0, start -20] for start, end in a], dtype=numpy.uint32) 
Out[17]: 
array([[ 0, 449], 
    [ 0, 151], 
    [ 0, 167], 
    [ 0, 184], 
    [ 0, 20], 
    [ 0, 36], 
    [ 0, 112], 
    [ 0, 1155], 
    [ 0, 464], 
    [ 0, 112], 
    [ 0, 146], 
    [ 0, 49], 
    [ 0, 122], 
    [ 0, 2098], 
    [ 0, 695], 
    [ 0, 281], 
    [ 0, 28], 
    [ 0, 43], 
    [ 0, 459]], dtype=uint32) 
+0

@ log0:同樣的錯誤:y = _nx.arange(0,num,dtype = dt) MemoryError >>> – user3631908

+0

你的原始數組有多大? – log0

+0

它是大約20000 – user3631908