2017-01-10 8 views
2

У меня есть массив (a), который является формой (1800,144), где a[0:900,:] - все действительные числа, а вторая половина массива a[900:1800,:] - все нули. Я хочу взять вторую половину массива и поместить его рядом с первой половиной горизонтально и соединить их так, чтобы новая форма массива (a) была равна (900,288), и массив, a, будет выглядеть так:Рефинансирование Python в определенном порядке с использованием np.reshape

[[1,2,3,......,0,0,0], 
[1,2,3,......,0,0,0], 
... 
] 

если это имеет смысл.

Когда я пытаюсь использовать np.reshape(a,(900,288)), он точно не делает то, что я хочу. Он делает массив всех действительных чисел от a[0:450,:] и нулями от a[450:900,:]. Я хочу, чтобы все нули были привязаны ко второму размеру, так что от a[0:900,0:144] все реальные числа и a[0:900,144:288] - все нули.

Есть ли простой способ сделать это?

ответ

1

Вы можете использовать numpy.hstack() для конкатенации двух массивов:

import numpy as np 
np.hstack([a[0:900,], a[900:1800,]]) 

Если вы хотите, чтобы разделить массив на более чем два суб массивов, вы можете комбинировать использование np.split и np.hstack, как @ HM14 прокомментировал:

np.hstack(np.split(a, n)) # assuming len(a) % n == 0 here 
+0

Это отлично работает, если я хочу разбить исходный массив на 2 и объединить его по горизонтали, но есть ли какой-то код или что-то, что я могу использовать, если хочу сказать, что разделить больший массив, чем тот, который я описал в 100 или 500 и конкатенировать его по горизонтали? есть ли простой способ сделать это без необходимости многократно использовать np.hstack? Может быть, петля или что-то еще? – HM14

+0

Одним из вариантов было бы использовать функцию 'reduce' из' functools', но вы также можете использовать цикл for для объединения результата по одному. – Psidom

+0

Использует ли сочетание np.split и hstack то же самое? Если это так, у меня может быть простое решение ... форма массива x есть '(1800,144)' then 'x = np.split (x, 2)', которая дает форму '(2,900,144)' then 'x = np.hstack (x) ', который дает xa форму' (900,288) '. Если это то же самое, то я могу разделить x на любое число таким образом? – HM14

1

извините, это слишком большое для комментариев, поэтому я отправлю его здесь. Если у вас длинный массив, и вам нужно разбить его и собрать его, есть и другие методы, которые могут это сделать. В этом примере показано, как собрать одинаковую последовательность чисел в один массив.

a = np.arange(100) 
>>> b = np.split(a,10) 
>>> c = np.c_[b] 
>>> c 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], 
     [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], 
     [70, 71, 72, 73, 74, 75, 76, 77, 78, 79], 
     [80, 81, 82, 83, 84, 85, 86, 87, 88, 89], 
     [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]) 

, чтобы вы могли легко разделить последовательность и легко собрать ее. Вы можете изменить порядок стекирования, если хотите. Возможно, это проще показать в этой последовательности.

d = np.r_[b[5:],b[:5]].ravel() 
>>> d 
array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
     68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 
     86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 1, 2, 3, 
     4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
     22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
     40, 41, 42, 43, 44, 45, 46, 47, 48, 49]) 

Этот пример просто показывает, что вы можете взять последние пять расщепленные последовательности и бросить их в передней части сваи. Не стоит задумываться о том, что если у вас есть ряд значений, даже неравной длины, вы можете поместить их в список и собрать их, используя функции удобства np.c_ и np.r_ (обычно np.c_ ожидать массивы одинакового размера).

Так что не решение вашего конкретного случая, возможно, но некоторые предложения о том, как собирать образцы по-разному.