为了账号安全,请及时绑定邮箱和手机立即绑定

一系列列表的逐元素随机选择(无循环)

一系列列表的逐元素随机选择(无循环)

天涯尽头无女友 2023-03-30 17:30:25
我想从一系列列表中的每个列表中随机选择一个元素。import pandas as pdimport numpy as npl=[['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o']]s = pd.Series(l)也是s:0    [a, b, c]1    [d, e, f]2    [g, h, i]3    [j, k, l]4    [m, n, o]dtype: object我知道我可以做到以下几点:s = pd.Series([np.random.choice(i) for i in s])哪个有效:0    a1    e2    h3    j4    mdtype: object但我想知道是否有非循环方法可以做到这一点?例如,(假设每个list大小相等)您可以创建一个随机索引数组来尝试从每个索引中选择不同的元素list:i = np.random.randint(3, size=len(l))#array([2, 2, 0, 1, 0])但是做 says[i]是行不通的,因为那是索引s而不是应用于每个list:2    [g, h, i]2    [g, h, i]0    [a, b, c]1    [d, e, f]0    [a, b, c]dtype: object我的动机是拥有可以处理大量列表的东西,从而避免循环。但是如果我的列表理解看起来是最合理的,或者没有内置pandas/numpy函数,请告诉我。
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

我只能这样想,但是,性能可能是问题


np.array(s.tolist())[np.arange(len(s)), np.random.randint(3, size=len(s))]

array(['c', 'e', 'i', 'k', 'n'], dtype='<U1')

一些时机


%timeit s.explode().sample(frac=1, random_state=1) 

5.05 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit pd.Series([np.random.choice(i) for i in s])

23.1 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit np.array(s.tolist())[np.arange(len(s)), np.random.randint(3, size=len(s))]

1.63 ms ± 50.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


查看完整回答
反对 回复 2023-03-30
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以尝试explode,随机播放分解的系列,然后采样。这甚至不需要列表具有相同的长度。


(s.explode()

   .sample(frac=1, random_state=1)  # random_state added for repeatability, drop if needed

   .groupby(level=0).head(1)

)

输出:


1    d

2    h

0    c

3    k

4    n

dtype: object


查看完整回答
反对 回复 2023-03-30
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信