不使用循环,如何对numpy array或者list中每个元素进行操作

在使用list或者numpy array时,经常需要对里面的每一个元素进行操作。当然使用for循环是最简单的,但for循环速度非常慢。在网上找了很久没有合适的,后来想到pandas包中的apply()函数,pandas包内置numpy array科学计算模块,速度大大高于for循环。

如我有个list 需要对里面的元素去除文件夹名字“chrom_kmer/”

>>> import numpy as np
>>> import pandas as pd
>>> idname
['chrom_kmer/1765.179.con.10_1mer', 'chrom_kmer/1765.179.con.10_12001mer', 'chrom_kmer/1765.179.con.10_18001mer', 'chrom_kmer/1765.179.con.10_24001mer', 'chrom_kmer/1765.179.con.10_30001mer', 'chrom_kmer/1765.179.con.10_36001mer', 'chrom_kmer/1765.179.con.10_42001mer', 'chrom_kmer/1765.179.con.10_48001mer', 'chrom_kmer/1765.179.con.105_1mer', 'chrom_kmer/1765.179.con.105_102001mer']

1. 最简单的方法是列表表达式,同for循环类似

最简单的是字符串切片,从第12个位置取:

>>> id_clear=[i[12:] for i in idname]
>>> id_clear
['765.179.con.10_1mer', '765.179.con.10_12001mer', '765.179.con.10_18001mer', '765.179.con.10_24001mer', '765.179.con.10_30001mer', '765.179.con.10_36001mer', '765.179.con.10_42001mer', '765.179.con.10_48001mer', '765.179.con.105_1mer', '765.179.con.105_102001mer']

这种类似for循环的方法太慢,可以使用numpy加pandas的apply函数,对里面元素进行操作,速度更快

2. 使用pd.apply()函数

>>> id_series=pd.Series(idname) # 将list或者numpy array转化为pandas的Series,如果是多维数组,改用pd.DataFrame()
>>> id_clear2=id_series.apply(lambda x:x[12:]) # 使用pandas.appy()函数
>>>id_clear2 # 得到的是numpy array
0          765.179.con.10_1mer
1      765.179.con.10_12001mer
2      765.179.con.10_18001mer
3      765.179.con.10_24001mer
4      765.179.con.10_30001mer
5      765.179.con.10_36001mer
6      765.179.con.10_42001mer
7      765.179.con.10_48001mer
8         765.179.con.105_1mer
9    765.179.con.105_102001mer
dtype: object
# 如果想转化为list,直接用numpy.tolist()函数
>>> id_clear2 = id_clear2.tolist()
>>> id_clear2
['765.179.con.10_1mer', '765.179.con.10_12001mer', '765.179.con.10_18001mer', '765.179.con.10_24001mer', '765.179.con.10_30001mer', '765.179.con.10_36001mer', '765.179.con.10_42001mer', '765.179.con.10_48001mer', '765.179.con.105_1mer', '765.179.con.105_102001mer']

大功告成,如果是多维array,可用pd.DataFrame()转化成pandas格式,采用apply()或者applymap()函数来操作。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值