2014-11-18 3 views
0

У меня есть две матрицы A и B с равным количеством столбцов, но обычно это неравное количество строк. Я хочу, чтобы сложить все пары столбцов из матрицы A и B. наивной реализации с для петли заключается в следующем:Добавление всех пар столбцов из двух матриц

import numpy as np 
ncol = 3 
nrow_A = 5 
nrow_B = 10 
A = np.ones((nrow_A,ncol)) 
B = np.zeros((nrow_B,ncol)) 

C = np.empty((nrow_A*nrow_B,ncol)) 
k = 0 
for i in range(nrow_A): 
    for j in range(nrow_B): 
     C[k,:] = A[i,:]+B[j,:] 
     k += 1 

, который в этом примере возвращает матрицу 50 * 3 заполнена единицами. Похоже, что это возможно с помощью одной строки кода. Как я могу это достичь?

ответ

1

Если вы перекроить A немного, вы можете добавить две матрицы вместе и объединить записи в первой оси результирующего массива:

>>> np.concatenate(A[:,np.newaxis,:] + B) 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.], 
     ... 

Немного более быстрая альтернатива concatenate заключается в использовании reshape:

(A[:,np.newaxis,:] + B).reshape(-1, 3) 
+0

Спасибо. Не конкатенировать довольно дорогостоящую операцию? – Forzaa

+0

@Forzaa - это правда, это может быть; вы можете использовать 'reshape' вместо этого (я добавил его к ответу) –

+0

Отлично! Очень удобно использовать функции numpy. На данный момент я еще недостаточно опытен, чтобы увидеть все возможности, поэтому очень приятно видеть эти примеры. – Forzaa

1

Это не красиво, но эта линия использует вещания, чтобы сделать то же самое:

(A[:, np.newaxis, :] + B[np.newaxis, :, :]).reshape(nrow_A * nrow_B, ncol) 

Пример

import numpy as np 
ncol = 3 
nrow_A = 5 
nrow_B = 10 
A = np.random.random_sample((nrow_A,ncol)) 
B = np.random.random_sample((nrow_B,ncol)) 

C = np.empty((nrow_A*nrow_B,ncol)) 
k = 0 
for i in range(nrow_A): 
    for j in range(nrow_B): 
     C[k,:] = A[i,:]+B[j,:] 
     k += 1 

D = (A[:, np.newaxis, :] + B[np.newaxis, :, :]).reshape(nrow_A * nrow_B, ncol) 

print(np.allclose(C, D)) 
+0

Ty. Вы дали почти тот же ответ, что и Ajcr, но поскольку в его версии также есть альтернатива, я принял это. – Forzaa

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