Умножение для трехмерного массива и нарезки - PullRequest
1 голос
/ 30 марта 2019

У меня есть матрица размером 5 x 98 x 3. Я хочу найти транспонирование каждого блока 98 x 3 и умножить его на себя, чтобы найти стандартное отклонение.Следовательно, я хочу, чтобы мой окончательный ответ был размером 5 x 3 x 3. Какой эффективный способ сделать это, используя numpy.

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

MU.shape[0] = 5
rows = 98
SIGMA = []
    for i in np.arange(MU.shape[0]):
        SIGMA.append([])
        SIGMA[i] = np.matmul(np.transpose(diff[i]),diff[i])
    SIGMA = np.array(SIGMA)
    SIGMA = SIGMA/rows

Здесь diff имеет размер 5 x 98 x 3.

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Вы можете использовать это:

my_result = arr1.swapaxes(1,2) @ arr1

Тестирование:

import numpy as np

NINETY_EIGHT = 10
arr1 = np.arange(5*NINETY_EIGHT*3).reshape(5,NINETY_EIGHT,3)

my_result = arr1.swapaxes(1,2) @ arr1
print (my_result.shape)

Выход:

(5, 3, 3)
1 голос
/ 30 марта 2019

Используйте np.einsum для суммирования последних осей друг против друга -

SIGMA = np.einsum('ijk,ijl->ikl',diff,diff)
SIGMA = SIGMA/rows

Используйте флаг optimize со значением True в np.einsum, чтобы использовать BLAS.

Мы также можем использовать np.matmul, чтобы получить эти sum-reductions -

SIGMA = np.matmul(diff.swapaxes(1,2),diff)
...