2014-11-18 2 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.], 
     ... 
(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

타이 : concatenate-약간 빠른 대안은 reshape를 사용하는 것입니다. Ajcr과 거의 같은 대답을했지만, 그의 버전에도 대안이 포함되어 있기 때문에 받아 들였습니다. – Forzaa