Python下几种从一个序列中取出元素的方法

随着深度学习以及人工智能领域的火热,Python越发普及和流行。使用Python进行数据处理时,有时候会有这样的操作,比如从一个列表或者numpy array中随机取出一个元素,对一个列表中的元素进行shuffle,等等。虽然这些操作也可以通过编写很简短的程序完成,但我们使用Python有一点很重要,就是不要重复遭轮子,如果有轮子可以直接拿来用,为什么不省时省力地去用呢?

1.从序列中随机取出一个或多个元素

使用random模块的sample函数: 从列表lst或numpy array中随机取出k(当然,k要小于等于lst中元素的个数)个元素:random.sample(lst, k)

import random
lst = range(20)
print(random.sample(lst, 1)) #取出1个元素
print(random.sample(lst, 5)) #取出多个元素

2.对一个序列中的元素进行shuffle

其实如果使用1中的sample函数,从lst中随机取出所有元素,也就实现了对列表中元素进行shuffle的目的。

import random
lst = range(20)
print(random.sample(lst, len(lst)))

也有另一种方法,使用numpy的random下的permutation函数,即:np.random.permutation。该函数直接输入一个序列,即返回shuffle后的该序列。其参数可以为列表,也可以为numpy array。

import numpy as np
nda = np.array(range(20))
print(np.random.permutation(nda))

3.从序列中取出固定长度的所有组合

有时候我们需要从序列中取出固定长度的所有组合,比如一个有10个元素的列表,我们从中取出所有元素的两两组合,即取出长度为2的所有组合,可以使用itertools模块的combinations函数:

import itertools
lst = range(10)
print(list(itertools.combinations(lst, 2)))

上面的程序中,因为itertools的函数返回的是一个iterator,所以需要用list将其转为列表,然后打印输出。

4.从序列中取出元素的所有排列组合

有时候我们需要从序列中取出元素的所有组合,比如,如果列表中的每个元素对应于一个模型的效果,我们想看不同模型ensamble起来的结果,来找到最优组合,就需要这种操作。 还是使用itertools的combinations函数,如下:

import itertools
lst = range(5)
for i in range(len(lst)):
_lst = itertools.combinations(lst, i+1)
print(_lst)

该函数返回的是一个iterable,所以打印显示前需要用list转化一下。 如果取出元素的顺序不同也算不同的方式,即取出元素的所有排列呢?可以使用itertools的permutations函数,如下:

import itertools
lst = range(5)
print(list(itertools.permutations(lst)))
print(list(itertools.permutations(lst, 3)))

该函数返回的也是一个iterable,所以打印显示前也需要用list转化一下。 此外,该函数可以传一个长度的参数,以示取出的排列长度。