R和Python在处理基本数组操作方面的差异

2024-06-16 10:22:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下Python代码:

n = 3
m = 2

y = np.random.normal(loc = 0, scale = 1, size = (n, m))
y_diff = np.expand_dims(y, 1) - np.expand_dims(y, 0)

我想将其转换为R。据我所知,它创建了一个$nxnxm$数组,其中$y_I-y_j$作为值

我找到了一种将expand_dims从python转换为R的方法(请参见:Translating Python np.expand_dims to R

现在在R中有以下代码:

m = 2
n = 3
x = array(rnorm(m*n),c(m,n))

以下两行似乎都起作用:

expand_dims(x,1)
expand_dims(x,2)

但不是:

expand_dims(x,2) - expand_dims(x,1)

该报告:

Error in expand_dims(x, 2) - expand_dims(x, 1) : non-conformable arrays

我的直觉是,Python和R在处理其数组上的基本操作方面存在差异

你知道如何让它在R中工作吗


Tags: to方法代码sizenpdiffrandom数组
1条回答
网友
1楼 · 发布于 2024-06-16 10:22:35

我认为listarrays::expand_dims()并没有真正按照你的期望工作;我想这就是你的问题所在。您应该能够通过比较看到这一点

np.expand_dims(y, 1)

listarrays::expand_dims(x, 2)

Python的numpy和R都是按元素进行减法的,所以这不是问题所在。我认为您最好直接在R中操作数组。为了便于说明,我将使用更简单的nxm矩阵

1 2
3 4
5 6

在Python中,我们有

z = np.array([[1, 2], [3, 4], [5, 6]])
z

array([[1, 2],
       [3, 4],
       [5, 6]])

np.expand_dims(z, 1) - np.expand_dims(z, 0)

array([[[ 0,  0],
        [-2, -2],
        [-4, -4]],

       [[ 2,  2],
        [ 0,  0],
        [-2, -2]],

       [[ 4,  4],
        [ 2,  2],
        [ 0,  0]]])

在R

n <- 3
m <- 2
z <- matrix(1:(n*m), nrow = n, byrow = TRUE)
z
#      [,1] [,2]
# [1,]    1    2
# [2,]    3    4
# [3,]    5    6
array(rep(t(z), each = 3), dim = c(n, m, n)) - array(z, dim = c(n, m, n))
# , , 1
# 
#      [,1] [,2]
# [1,]    0    0
# [2,]   -2   -2
# [3,]   -4   -4
# 
# , , 2
# 
#      [,1] [,2]
# [1,]    2    2
# [2,]    0    0
# [3,]   -2   -2
# 
# , , 3
# 
#      [,1] [,2]
# [1,]    4    4
# [2,]    2    2
# [3,]    0    0

相关问题 更多 >