R和Python的对应:outer()

相信大家做模拟时一定碰到过变量之间的这种相关结构:

\[\mathbf{\rho}=\left(\rho_{ij}\right)_{n\times n}=0.5^{|i-j|} \]

在模拟这个相关矩阵时,R中常用的函数便是outer()函数:

outer(X=1:3,Y=1:3,FUN=function(x,y){0.5^abs(x-y)})

那python中对应的操作是啥?关键就是要找到对应的outer操作,而这一操作在NumPy库的ufunc类(universal function)即可找到。
创建np.ufunc类有以下方式,一是通过NumPy的frompyfunc函数,二是通过Numba库的vectorize装饰器。就运行速度来讲,后者会比前者快得多
具体例子如下:

  • NumPy的frompyfunc函数
import numpy as np
pyfun = np.frompyfunc(lambda x,y: 0.5**abs(x-y), 2, 1) # '2'代表2个输入参数,'1'代表1个输出值
pyfun.outer(np.array([1, 2, 3]), np.array([1, 2, 3])).astype(np.float64)
  • Numba的vectorize装饰器
from numba import vectorize, float64, int32
import numpy as np
@vectorize([float64(int32, int32)])
def nbfun(x, y):
    return 0.5*abs(x-y)
nbfun.outer(np.array([1, 2, 3]), np.array([1, 2, 3]))

可以看到,这两种方法还是比较通用的,因为使用者可以自定义一些函数。
参考链接:

  1. Numpy库的frompyfunc
  2. Numba库的vectorize

posted on 2023-05-14 20:04  纵横二剑  阅读(99)  评论(0编辑  收藏  举报