相信大家做模拟时一定碰到过变量之间的这种相关结构:
\[\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]))
可以看到,这两种方法还是比较通用的,因为使用者可以自定义一些函数。
参考链接: