2016-03-13 3 views
0

Я ищу объединить 3 матрицы определенным образом, я уверен, что это будет легко для тех, кто привык использовать NumPy:Numpy точечных продукты 3 матриц

w = np.array([[-0.46733567, 0.38864732], 
       [-0.42436867, -1.08760098], 
       [-1.01118741, 0.99096466]]) 

a = array([[ 0.63127368, 0.00167775, 0.97812284]]) 

d = [[-0.43252997]] # although d is length 1 in this example, its often >1 in length and code needs to be able to generalize, there will always be the same length of cols and and arrays between a and w, i.e in this example there are 3 arrays in w and 1 of length 3 in a (please excuse my terminology, I am new to linear algebra). 

Я пытаюсь объединить их найти dx так, чтобы:

dx1 = [-0.46733567, 0.38864732] * 0.63127368 * -0.43252997 
dx2 = [-0.42436867, -1.08760098] * 0.00167775 * -0.43252997 
dx3 = [-1.01118741, 0.99096466] * 0.97812284 * -0.43252997 

если d есть длина 1, например d = np.array ([[- 0,43252997], [0,87500009]]), то:

dx1_1 = [-0.46733567, 0.38864732] * 0.63127368 * -0.43252997 
dx2_1 = [-0.42436867, -1.08760098] * 0.00167775 * -0.43252997 
dx3_1 = [-1.01118741, 0.99096466] * 0.97812284 * -0.43252997 
dx1_2 = [-0.46733567, 0.38864732] * 0.63127368 * 0.87500009 
dx2_2 = [-0.42436867, -1.08760098] * 0.00167775 * 0.87500009 
dx3_2 = [-1.01118741, 0.99096466] * 0.97812284 * 0.87500009 

Я попробовал все из них, но, казалось бы, не имели успеха, если я что-то не хватает?

out = np.dot(d, w) * a 
out = np.dot(d, w) * a.T 
out = np.dot(d, w.T) * a 
out = np.dot(a, w) * d 
out = np.dot(a, w.T) * d 

Я получаю сообщение об ошибке во многих случаях:

ValueError: shapes (3,1) and (3,2) not aligned: 1 (dim 1) != 3 (dim 0) 

любые указатели, чтобы помочь решить эту проблему была бы оценена

+0

Похоже на основную проблему линейной алгебры. У вас есть несоответствие размеров, поэтому продукт точки не будет работать –

+0

Какие случаи * не * вы получаете эту ошибку и какую ошибку вы делаете * вы получаете? –

+0

Ваш пример не выглядит так, как если бы вам нужен точечный продукт. Вы хотите получить 'len (a) * len (d)' вектор длины 2, правильно? – Ilja

ответ

3

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

Я повторяю ваши массивы на третьей оси (это становится актуальным, если d больше 1).

И затем умножьте соответствующую ось ...:

w = np.array([[-0.46733567, 0.38864732], 
       [-0.42436867, -1.08760098], 
       [-1.01118741, 0.99096466]]) 

a = np.array([[ 0.63127368, 0.00167775, 0.97812284]]) 

d = np.array([[-0.43252997]]) 

(dim1, dim2), dim3 = w.shape, len(d[0]) 

wnew = w.reshape(dim1, dim2, 1) 
anew = a.reshape(dim1, 1, 1) 
dnew = d.reshape(1, 1, dim3) 

product = wnew * anew * dnew 
i, j = 0, 0 
print product[i, :, j] 

последний оператор печатает то, что вы называли dx_ij

+0

Подождите, зачем вам здесь повторять? Не вещает ли с ним вещание? – Eric

+0

Да, это, вероятно, одно и то же, только я не знаком с вещанием ... и: «Явный лучше, чем неявный» :) – Ilja

+1

Я бы сказал, что лучше использовать библиотеку, поскольку она предназначена для использования. Явные изменения являются разумными, но повторы абсолютно не нужны и, предположительно, медленнее – Eric

1

Когда вы множественным две матрицы, они должны иметь общий размер. В вашем примере:

>>> out = np.dot(a, w) 
>>> print out 
[[-1.28479419 1.21280327]] 

для получения дополнительной информации: https://en.wikipedia.org/wiki/Matrix_multiplication Если А является п × м матрицы и В является т × р матрицы, матрица произведение АВ (обозначается без признаков умножения или точек) определяется - матрица n × p.

С наилучшими пожеланиями, Ярон

2

Going форматом входных массивов, в частности, что формы всех входных массивов 2D и предполагая, что вы хотели бы сохранить выход в 3D массив, вот подход с использованием broadcasting -

(w.T)[:,:,None]*(a[0,:,None]*d[:,0]) 

Пример запуска -

In [48]: # Input arrays 
    ...: w = np.array([[-0.46733567, 0.38864732], 
    ...:     [-0.42436867, -1.08760098], 
    ...:     [-1.01118741, 0.99096466]]) 
    ...: 
    ...: a = np.array([[ 0.63127368, 0.00167775, 0.97812284]]) 
    ...: 
    ...: d= np.array([[-0.43252997],[0.87500009]]) 
    ...: 
    ...: dx1_1 = np.array([-0.46733567, 0.38864732]) * 0.63127368 * -0.43252997 
    ...: dx2_1 = np.array([-0.42436867, -1.08760098]) * 0.00167775 * -0.43252997 
    ...: dx3_1 = np.array([-1.01118741, 0.99096466]) * 0.97812284 * -0.43252997 
    ...: dx1_2 = np.array([-0.46733567, 0.38864732]) * 0.63127368 * 0.87500009 
    ...: dx2_2 = np.array([-0.42436867, -1.08760098]) * 0.00167775 * 0.87500009 
    ...: dx3_2 = np.array([-1.01118741, 0.99096466]) * 0.97812284 * 0.87500009 
    ...: 
    ...: # Let's store these in a 3D array 
    ...: p1 = np.column_stack((dx1_1,dx2_1,dx3_1)) 
    ...: p2 = np.column_stack((dx1_2,dx2_2,dx3_2)) 
    ...: out = np.dstack((p1,p2)) 
    ...: 

печати выводит из оригинальных и предложенных подходов, основанных на трансляции для проверки -

In [49]: out         # Output from original approach 
Out[49]: 
array([[[ 1.27603568e-01, -2.58139646e-01], 
     [ 3.07954650e-04, -6.22986533e-04], 
     [ 4.27800472e-01, -8.65432403e-01]], 

     [[ -1.06118124e-01, 2.14674993e-01], 
     [ 7.89247187e-04, -1.59663239e-03], 
     [ -4.19244884e-01, 8.48124609e-01]]]) 

In [50]: (w.T)[:,:,None]*(a[0,:,None]*d[:,0]) # Output from proposed solution 
Out[50]: 
array([[[ 1.27603568e-01, -2.58139646e-01], 
     [ 3.07954650e-04, -6.22986533e-04], 
     [ 4.27800472e-01, -8.65432403e-01]], 

     [[ -1.06118124e-01, 2.14674993e-01], 
     [ 7.89247187e-04, -1.59663239e-03], 
     [ -4.19244884e-01, 8.48124609e-01]]]) 

Если входные массивы a и d являются 1D массивы:

a = np.array([ 0.63127368, 0.00167775, 0.97812284]) 
d = np.array([-0.43252997,0.87500009]) 

, решение будет упрощать -

(w.T)[:,:,None]*(a[:,None]*d) 
Смежные вопросы