如何在R中实现类似Numpy的贴近数学定义的矩阵创建方式?
在R中实现类似NumPy的矩阵外积操作
你在Python里用NumPy通过广播机制,轻松创建了满足N_mat[i,j] = m[i] * n[j]的6行4列矩阵,R里有多种简洁的方式实现相同效果,和NumPy的风格贴近:
方法1:用outer()函数(最直观)
这是R专门用于计算外积的函数,语法直接对应你的需求:
n <- 0:3 # 对应Python的np.arange(4) m <- 0:5 # 对应Python的np.arange(6) # 创建元素为m[i]*n[j]的矩阵 N_mat <- outer(m, n, FUN = "*") # 因为乘法是默认运算,还可以简化成: # N_mat <- outer(m, n)
方法2:原生广播(贴近NumPy写法)
R 4.1及以上版本支持原生广播,你可以通过扩展向量维度实现和NumPy几乎一样的操作:
n <- 0:3 m <- 0:5 # 方式1:转置+矩阵乘法 N_mat <- as.matrix(m) %*% t(as.matrix(n)) # 方式2:类似NumPy的np.newaxis扩展维度 N_mat <- m[, , drop = FALSE] * n[ , , drop = FALSE]
其中[, , drop = FALSE]的作用和NumPy里的np.newaxis一致,用来把向量转为矩阵维度,触发广播乘法。
方法3:用tcrossprod()函数
如果是做元素乘法的外积,tcrossprod()也能快速实现,它会自动处理向量的转置运算:
n <- 0:3 m <- 0:5 N_mat <- tcrossprod(m, n)
内容的提问来源于stack exchange,提问作者larry77
相关产品推荐
相关产品推荐

