我們先來試着瞭解在python numpy
和R
中填充多維數組的順序,它們是不同的。
在python
import numpy as np
np.arange(16).reshape((2,4,2)) # fill with 0:15
#[[[ 0 1]
# [ 2 3]
# [ 4 5]
# [ 6 7]]
# [[ 8 9]
# [10 11]
# [12 13]
# [14 15]]]
在R
array(0:15, dim=c(2,4,2)) # fill with 0:15
#, , 1
# [,1] [,2] [,3] [,4]
#[1,] 0 2 4 6
#[2,] 1 3 5 7
#, , 2
# [,1] [,2] [,3] [,4]
#[1,] 8 10 12 14
#[2,] 9 11 13 15
現在具有的填充順序的瞭解,讓我們試圖模仿np.dot
中的R具有相同的數據,A,B
作爲輸入陣列和C
作爲輸出陣列(對於我們將需要改變尺寸的順序):
在python
:
import numpy as np
a = np.arange(40).reshape((10,4)) # 0:39
b = np.arange(16).reshape((2,4,2)) # 0:15
print a
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]
[32 33 34 35]
[36 37 38 39]]
print b
[[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]
[12 13]
[14 15]]]
print np.dot(a, b)
[[[ 28 34]
[ 76 82]]
[[ 76 98]
[ 252 274]]
[[ 124 162]
[ 428 466]]
[[ 172 226]
[ 604 658]]
[[ 220 290]
[ 780 850]]
[[ 268 354]
[ 956 1042]]
[[ 316 418]
[1132 1234]]
[[ 364 482]
[1308 1426]]
[[ 412 546]
[1484 1618]]
[[ 460 610]
[1660 1810]]]
在R
得到我們需要下面的代碼相同的結果:
A <- matrix(0:39, nrow=10, byrow=TRUE) # 0:39
A
[,1] [,2] [,3] [,4]
[1,] 0 1 2 3
[2,] 4 5 6 7
[3,] 8 9 10 11
[4,] 12 13 14 15
[5,] 16 17 18 19
[6,] 20 21 22 23
[7,] 24 25 26 27
[8,] 28 29 30 31
[9,] 32 33 34 35
[10,] 36 37 38 39
B <- array(0, dim=c(4,2,2)) # notice the change in dimensions
B[,,1] <- matrix(0:7, nrow=4, byrow=TRUE)
B[,,2] <- matrix(8:15, nrow=4, byrow=TRUE)
B # 0:15
, , 1
[,1] [,2]
[1,] 0 1
[2,] 2 3
[3,] 4 5
[4,] 6 7
, , 2
[,1] [,2]
[1,] 8 9
[2,] 10 11
[3,] 12 13
[4,] 14 15
C <- array(0, dim=c(2,2,10)) # again note the change in dimensions
for (i in 1:10) {
for (j in 1:2) {
for (k in 1:2) {
C[k,j,i] = sum(A[i,]*B[,j,k])
}
}
}
C
, , 1
[,1] [,2]
[1,] 28 34
[2,] 76 82
, , 2
[,1] [,2]
[1,] 76 98
[2,] 252 274
, , 3
[,1] [,2]
[1,] 124 162
[2,] 428 466
, , 4
[,1] [,2]
[1,] 172 226
[2,] 604 658
, , 5
[,1] [,2]
[1,] 220 290
[2,] 780 850
, , 6
[,1] [,2]
[1,] 268 354
[2,] 956 1042
, , 7
[,1] [,2]
[1,] 316 418
[2,] 1132 1234
, , 8
[,1] [,2]
[1,] 364 482
[2,] 1308 1426
, , 9
[,1] [,2]
[1,] 412 546
[2,] 1484 1618
, , 10
[,1] [,2]
[1,] 460 610
[2,] 1660 1810
我們可以看到的結果是完全一樣的。現在您可以嘗試使用自己的數據。
'B'是一個二維數組,對於一個三維數組,你需要函數'array()'。你也使用'%%'而不是'%*%'。 – LyzandeR
感謝是我應該用'陣列()'和'%*%'。有錯別字!現在解決。無論如何 - 修復後的結果是一樣的 – user2498193