在numpy数组中拆分元素

时间:2016-11-21 12:16:41

标签: python arrays numpy

我有一个大数组,其中一部分显示在下面的小例子中。 在每个列表中,第一个数字是开始,第二个数字是结束 (所以有一个范围)但每个元素都是一个序列的一部分 每个序列从零开始。 。我想做的是:

小例子:

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)到 (开始-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)
你知道怎么做吗?

2 个答案:

答案 0 :(得分: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中同时保留阵列。您可以将阵列分成多个部分,并分别对不同部分应用操作,也可以单独处理。如果这是不可能的

答案 1 :(得分: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)