从100个样本中随机抽样10个。
>>> from random import randint,sample
>>> lst = [randint(0,50) for _ in range(100)]
>>> print(lst[:5])
[20, 8, 41, 23, 46]
>>> lst_sample = sample(lst,10)
>>> print(lst_sample)
[36, 28, 21, 0, 30, 15, 14, 33, 41, 41]
sample(population, k) 从一个总体序列或集合中选择k个唯一的随机元素。 返回包含从总体样本中抽取的元素的新列表,并保持原有总体不变。得到的子列表在顺序上也都是随机有效的样本。 总体的样本不需要是可哈希的或唯一的。如果总体包含重复,那么从样本中的选择时,每次都可能出现重复。 若要在整数范围内选择样本,请使用
range
作为参数。这是一种从大量数据集中获取样本的一种快速且高效的方式。如sample(range(10000000), 60)
使用 shuffle
用来重洗数据集,值得注意是对lst就地(in place)洗牌,节省存储空间
>>> from random import shuffle
>>> lst = [randint(0,50) for _ in range(100)]
>>> shuffle(lst)
[7, 28, 5, 37, 45]
shuffle(x, random=None) 将列表x打乱,并返回None。 可选参数
random
是一个返回随机浮点[0.0,1.0)的0-argument函数
;如果是默认的None,将使用标准的random.random
>>> from random import uniform
>>> [(uniform(0,10),uniform(0,10)) for _ in range(10)]
[(6.643596777616202, 3.5115242492691467),
(3.4949560525825962, 7.510853289193182),
(1.1092148827575243, 5.634172711274042),
(9.183709555758819, 8.908040124716795),
(7.594823632503429, 4.400078595488905),
(4.647608230003916, 1.384902231109253),
(5.9078617837913825, 0.37118346097973154),
(4.537170273203939, 5.954232690970358),
(3.3023378016785965, 2.1624635620941457),
(3.542548865043048, 7.503268030444582)]
random模块中的
生成均值为
, 标准差为
的满足高斯分布的值,如下生成10个 二维坐标点,样本误差
满足均值为0,标准差为1的高斯分布:
>>> from random import gauss
>>> x = range(10)
>>> y = [2*i+1+gauss(0,1) for i in x]
>>> points = list(zip(x,y))
[(0, 1.223673868726624),
(1, 4.176537183081072),
(2, 5.117260621617949),
(3, 8.71363059466428),
(4, 10.187466638278366),
(5, 11.492275314042141),
(6, 15.54479507833611),
(7, 15.190090448274328),
(8, 17.593253407659496),
(9, 19.468177475201106)]
python五类参数:位置参数, 关键字参数, 默认参数, 可变位置, 关键字参数
的使用。
def f(a,*b,c=10,**d):
print(f'a:{a},b:{b},c:{c},d:{d}')
默认参数c
不能位于可变关键字参数d
后。可变位置参数 b
实参后被解析为元组;而c
取得默认值10; d
被解析为字典。
>>> f(1,2,5,width=10,height=20)
a:1,b:(2, 5),c:10,d:{'width': 10, 'height': 20}
>>> f(a=1,c=12)
a:1,b:(),c:12,d:{}
a=1
传入时a
就是关键字参数,b,d
都未传值,c
被传入12,而非默认值。
注意观察参数 a
, 既可以f(1)
,也可以 f(a=1)
其可读性比第一种更好,建议使用f(a=1)
。如果要强制使用 f(a=1)
,需要在前面添加一个**星号 *
** :
def f(*,a,*b):
print(f'a:{a},b:{b}')
此时f(1)
调用,将会报错: TypeError: f() takes 0 positional arguments but 1 was given
只能 f(a=1)
.
说明前面的*
发挥作用,它变为只能传入关键字参数,那么如何查看这个参数的类型呢?借助python 的 inspect 模块
:
>>> for name,val in signature(f).parameters.items():
... print(name,val.kind)
a KEYWORD_ONLY
b VAR_KEYWORD
可看到参数 a
的类型为 KEYWORD_ONLY
,也就是仅仅为关键字参数
>>> def f(a,*b):
... print(f'a:{a},b:{b}')
>>> for name,val in signature(f).parameters.items():
... print(name,val.kind)
a POSITIONAL_OR_KEYWORD
b VAR_POSITIONAL
可以看到参数 a
既可以是位置参数也可是关键字参数。