2015-01-24 2 views
6

У меня есть список, содержащий numpy-массивы, такие как L = [a, b, c], где a, b и c - массивы numpy с размерами N_a в T, N_b в T и N_c в T.
Я хочу, чтобы row-wise объединял a, b и c и получал массив numpy с формой (N_a + N_b + N_c, T). Очевидно, что одно решение запускает цикл for и использует numpy.concatenate, но есть ли какой-нибудь питонический способ сделать это?объединить массивы numpy, которые являются элементами списка

Благодаря

ответ

10

Используйте numpy.vstack.

L = (a,b,c) 
arr = np.vstack(L) 
+1

Большое спасибо. похоже, что мои баллы еще недостаточно, чтобы проголосовать за вас. – TNM

+1

@TNM Вы можете выбрать это как правильный ответ. – BenB

2

help('concatenate' имеет эту подпись:

concatenate(...) 
    concatenate((a1, a2, ...), axis=0) 

    Join a sequence of arrays together. 

(a1, a2, ...) выглядит ваш список, не так ли? И ось по умолчанию - это та, которую вы хотите присоединиться. Так давайте попробуем это:

In [149]: L = [np.ones((3,2)), np.zeros((2,2)), np.ones((4,2))] 

In [150]: np.concatenate(L) 
Out[150]: 
array([[ 1., 1.], 
     [ 1., 1.], 
     [ 1., 1.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 1., 1.], 
     [ 1., 1.], 
     [ 1., 1.], 
     [ 1., 1.]]) 

vstack также делает это, но посмотрите на его код:

def vstack(tup): 
    return np.concatenate([atleast_2d(_m) for _m in tup], 0) 

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

+1

Я вижу. Поэтому, по сути, лучше использовать конкатенацию здесь. Спасибо – TNM

+1

'vstack' не должен добавить много времени, поскольку он просто возится со свойствами, такими как форма и шаги. В основном это функция удобства. – hpaulj

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