Python 三维阵列的乘法和切片
我有一个5 x 98 x 3的矩阵。我想找到98 x 3的每个块的转置,然后将它与自身相乘,得到标准偏差。 因此,我希望最终答案的大小为5 x 3 x 3。 使用numpy进行此操作的有效方法是什么 我目前可以使用以下代码执行此操作:Python 三维阵列的乘法和切片,python,numpy,matrix-multiplication,Python,Numpy,Matrix Multiplication,我有一个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.t
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
此处的差异大小为5 x 98 x 3。使用
np.einsum
求和,以减少最后一个轴彼此之间的偏移-
SIGMA = np.einsum('ijk,ijl->ikl',diff,diff)
SIGMA = SIGMA/rows
在np.einsum
中使用optimize
标志和True
值来利用BLAS
我们还可以使用np.matmul
来获得那些总和缩减
-
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)
输出:
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)
差异只是数据集和平均值之间的差异。穆是中庸的,谢谢。工作得很有魅力。尽管如此,我还是需要详细阅读einsum函数。@Divakar:+1。很高兴被介绍到
np.einsum()
。必须仔细阅读,才能理解“爱因斯坦总和”在这里的适用性这里没有乘法运算。我想解释一下你提到的矩阵乘法的要求。@
运算符执行矩阵乘法。看看你接受的另一个答案,我怀疑我可能误解了你的问题。我以为你的要求只是执行乘法部分。您是否还希望代码计算差异、平均值等。?还是已经计算并存储在形状(5,98,3)
的arr1
中?我已经计算了差异。我只是在乘法部分有问题。另外,我也不知道@operator执行交互应用。谢谢你。我会尽量尝试你的方法well@AhmedJunaidKhalid@
与matmul相同,特定于Python 3.x。更多信息-