2016-06-11 4 views
1

У меня есть ndarray, A, и я хочу, чтобы умножить этот элемент ndarray накрест другой массив 1D b где я предполагаю, что A.shape[i] = len(b) для некоторых i. Мне нужна эта общность в моем приложении.np.tile повторить 1D массив

я могу сделать это с помощью np.tile следующим образом:

A = np.random.rand(2,3,5,9) 
b = np.random.rand(5) 
i = 2 
b_shape = np.ones(len(A.shape), dtype=np.int) 
b_shape[i] = len(b) 
b_reps = list(A.shape) 
b_reps[i] = 1 
B = np.tile(b.reshape(b_shape), b_reps) 

# Here B.shape = A.shape and 
# B[i,j,:,k] = b for all i,j,k 

Это меня поражает, как некрасиво. Есть лучший способ сделать это?

+1

Probbaly 'A * B [:, None]' , Для получения дополнительной информации читайте «Вещание NumPy». – Divakar

ответ

2

Для этого конкретного примера, следующий код будет делать трюк:

result = A*b[:, np.newaxis] 

Для любого значения i, попробуйте следующее:

A2, B = np.broadcast_arrays(A, b) 
result = A2*B 
+0

Спасибо. Это похоже на то, что мне нужно. @Divakar еще более компактен. – Tohiko

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