2016-11-21 2 views
2

У меня есть большой массив, и часть этого показана в небольшом примере ниже. в каждом списке, первое число начинается, а второе число - (поэтому существует диапазон), но каждый элемент является частью последовательности и каждая последовательность начинается с нуля. . что я хочу сделать, это:Сплит-элементы в массиве 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) 

вы, ребята, знаете, как это сделать?

+0

Я попытался это и работал отлично: CDS1 = np.column_stack ([np.zeros (LEN (cdspos), DTYPE = "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) для вторых номеров столбцов. Если вы снова получите ошибку памяти, это означает, что вы не можете сохранить свои массивы сразу в своей ОЗУ. Вы можете разделить массив на несколько частей и применять операции на разных частях отдельно и обрабатывать их отдельно. Если это не представляется возможным

+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

Смежные вопросы