3d 数组的乘法和切片

Multiplication for a 3d array and slicing

我有一个大小为 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。

使用np.einsum求和减少最后一个轴相互偏离-

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

使用 optimize 标志和 np.einsum 中的 True 值来利用 BLAS

我们也可以使用np.matmul得到那些sum-reductions-

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

你可以使用这个:

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)