2017-02-18 35 views
2
>>> c= array([[[1, 2], 
       [3, 4]], 

       [[2, 1], 
       [4, 3]], 

       [[3, 2], 
       [1, 4]]]) 
>>> x 
array([[0, 1, 2], 
     [3, 4, 5]]) 

возвращает мне такую ​​матрицу, что каждый столбец является произведением каждой матрицы из c, умножая каждый соответствующий столбец x на регулярное матричное умножение. Я пытаюсь выяснить способ его векторизации или, по крайней мере, не использовать для цикла, чтобы решить эту проблему.Операция numble array

array([[6, 6, 16] 
     12, 16, 22]]) 

для расширяет эта операция дальше будет говорить, что у меня есть массив матриц, скажет

>>> c 
    array([[[1, 2], 
    [3, 4]], 

    [[2, 1], 
    [4, 3]], 

    [[3, 2], 
    [1, 4]]]) 
>>> x 
    array([[[1, 2, 3], 
    [1, 2, 3]], 

    [[1, 0, 2], 
    [1, 0, 2]], 

    [[2, 3, 1], 
    [0, 1, 0]]]) 


def fun(c,x): 
    for i in range(len(x)): 
     np.einsum('ijk,ki->ji',c,x[i]) 
     ##something 

Так в основном, я хочу, чтобы иметь каждую матрицу в й умножении со всеми с. возвращает структуру, аналогичную с без введения этого цикла

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

Xc (операция следует за нормальную столбец матрицы векторное умножение), c - трехмерный массив; как c сверху - вектор столбца, который каждый элемент является матрицей (в numpy его форме в приведенном выше). X - матрица с каждым элементом, является 1D-массивом. Выходной сигнал Xc должен быть 1D-массивом.

+0

Таким образом, ожидаемый выход 3D тоже? – Divakar

+0

@ Divakar YES, для удовольствия (c, x) это должен быть 3D-массив; – ElleryL

ответ

1

Вы можете использовать np.einsum -

np.einsum('ijk,ki->ji',c,x) 

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

In [155]: c 
Out[155]: 
array([[[1, 2], 
     [3, 4]], 

     [[2, 1], 
     [4, 3]], 

     [[3, 2], 
     [1, 4]]]) 

In [156]: x 
Out[156]: 
array([[0, 1, 2], 
     [3, 4, 5]]) 

In [157]: np.einsum('ijk,ki->ji',c,x) 
Out[157]: 
array([[ 6, 6, 16], 
     [12, 16, 22]]) 

Для 3D случае x, просто добавить новое измерение в начале строки обозначении x и, соответственно, в нотации выходной строки, например:

np.einsum('ijk,lki->lji',c,x) 

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

In [151]: c 
Out[151]: 
array([[[1, 2], 
     [3, 4]], 

     [[2, 1], 
     [4, 3]], 

     [[3, 2], 
     [1, 4]]]) 

In [152]: x 
Out[152]: 
array([[[1, 2, 3], 
     [1, 2, 3]], 

     [[1, 0, 2], 
     [1, 0, 2]], 

     [[2, 3, 1], 
     [0, 1, 0]]]) 

In [153]: np.einsum('ijk,lki->lji',c,x) 
Out[153]: 
array([[[ 3, 6, 15], 
     [ 7, 14, 15]], 

     [[ 3, 0, 10], 
     [ 7, 0, 10]], 

     [[ 2, 7, 3], 
     [ 6, 15, 1]]]) 
+0

Я пытался несколько раз манипулировать ijk; Я не мог этого сделать. Если x также является массивом матриц, то return является массивом матриц, так что каждая матрица генерируется так, как указано выше? – ElleryL

+0

@ElleryL Не уверен, что вы подразумеваете под «массивом матриц». Не могли бы вы разместить образец? – Divakar

+0

Я редактировал исходные вопросы; не уверен, если я хорошо объясню – ElleryL