本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
  
 
原帖标题为:apply () 族函数和它们在 Python 中的实现
原帖网址为:https://verimake.com/topics/244 (旧版论坛网址,已失效)
  
 
原帖作者为:dawdler(旧版论坛 id = 64,注册于 2020-08-17 14:01:22)  
原帖由作者初次发表于 2021-07-05 19:59:43,最后编辑于 2021-07-05 19:59:43(编辑时间可能不准确)
  
 
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 305 次浏览、0 个点赞、0 条回复
  
  
  
R语言
apply()族函数和它们在Python中的实现
<更新中>
1.1 apply()
在R语言中,当我们想对一个矩阵或数据框的行或列进行特定操作的时候,我们常用apply()函数:
  
		apply(x, margin, function)
其中,x就是我们要进行操作的矩阵或数据框名;
  
margin是要进行操作的维度,1代表行(row),2代表列(colmun);
  
function是我们针对行列要操作的函数,可以是R中内置的函数如: min(),sum()等,也可以直接在调用apply()时定义。举例:
  
grade <- data.frame(math = c(82,75,98,80),
					history = c(68,87,90,65),
				    chemistry = c(89,92,73,95))
print(grade)
#find the mean of each column
print(apply(data, 2, mean))
以上代码的输出结果:  

简单的apply()函数在Python中实现起来也很简单,可以写一个简单的循环,针对里面的数据依次操作。下面的sapply()和lapply()我们会举例说明——
1.2 sapply()
sapply()和lapply()的语法和apply()大致相同,就不细说了,也是将数据处理过后以向量、矩阵或列表的形式输出。直接来看例子:这是sapply()在R中的一个简单应用——
 
m1 <- c(1,3,5,7,9)
m2 <- c(2,4,6,8,10,12)
mat <- list(m1,m2)
print(mat)
##t(): tranpose matrix
##seq(): create a sequence
new_mat <- t(sapply(mat,'[',seq(max(sapply(mat,length)))))
print(new_mat)
以上代码的输出结果:  

这段代码在Python中,我们是这么实现的:
  
import numpy as np
m1 = np.array([1,3,5,7,9])
m2 = np.array([2,4,6,8,10,12])
mat = [m1,m2]
print(mat)
length = max([len(i) for i in mat])
mat_ = []
for i in range(0, len(mat)):
    mat[i] = mat[i].astype(np.float32)
    #自动填充NaN
    mat[i] = np.pad(mat[i], (0,length-len(mat[i])),"constant",constant_values=np.nan)
    mat_.append(mat[i].tolist())
mat = np.array(mat_)
以上代码的输出结果为:  

1.3 lapply()
lapply()与sapply()最大的不同,就是它的返回值只会是列表:
  
<未完待续>