R 相当于 Python 的 np.dot for 3D array

use*_*193 2 python arrays numpy r matrix

我正在将一些涉及 3D 矩阵的代码从 Python 翻译成 R。这很棘手,因为我对 Python 或矩阵代数知之甚少。总之在Python代码中,我有一个矩阵dot.product如下:np.dot(A, B)。矩阵 A 的维数为 (10, 4),矩阵 B 的维数为 (2, 4, 2)。(这些维度可能会有所不同,但始终会在第二个维度上匹配)。所以 np.dot 从文档中看没有问题:

“对于二维数组,它相当于矩阵乘法,对于一维数组,相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和第二个到- b的最后一个:”

因此它沿 A=4 的第二个轴和 B=4 的中轴相乘,并输出一个 (10,2,2) 矩阵。=> 没问题。但是在 R 中,%*%没有这种行为并抛出“不符合数组”的错误。

r 中的玩具示例:

A <- matrix( rnorm(10*4), nrow=10, ncol=4)
B <- array( rnorm(2*4*2), c(2,4,2))
A %*% B
Error in A %*% B : non-conformable arrays
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题以实现与 相同的计算np.dot

Ben*_*ker 5

我们可以用aperm()和做到这一点tensor::tensor。使用@SandipanDey 的例子。

设置数组(您需要aperm获得适当的 B,我在此处将其称为 B2):

A <- matrix(0:39,ncol=4,byrow=TRUE)
B <- array(0:15,dim=c(2,4,2))
B2 <- aperm(B,c(2,1,3),resize=TRUE)
Run Code Online (Sandbox Code Playgroud)

tensor::tensor 进行正确的计算,但我们需要重塑结果:

library(tensor)
C <- tensor(A,B2,2,1)
aperm(C,c(3,2,1),resize=TRUE)
Run Code Online (Sandbox Code Playgroud)