本篇文章由 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))
以上代码的输出结果:
![](https://verimake.com/assets/files/2022-02-21/1645421988-960903-30.png)
简单的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)
以上代码的输出结果:
![](https://verimake.com/assets/files/2022-02-21/1645422016-382735-31.png)
这段代码在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_)
以上代码的输出结果为:
![](https://verimake.com/assets/files/2022-02-21/1645422041-330968-32.png)
1.3 lapply()
lapply()
与sapply()
最大的不同,就是它的返回值只会是列表:
<未完待续>