2016-11-21 91 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