如何通过保留除一个以外的所有属性来随机打乱种群?

Posted

技术标签:

【中文标题】如何通过保留除一个以外的所有属性来随机打乱种群?【英文标题】:How to randomly shuffle a populaiton by preserving all properites except one? 【发布时间】:2020-06-26 11:41:18 【问题描述】:

空间的球形区域充满了特定分布的更小、不同大小的球体。每个球体都与一些物理属性相关联:位置、半径、质量、速度和 ID,都表示为 1d 或 3d numpy 数组。我想以完全随机的方式对这些球体进行洗牌,这样任何单个球体都会保留其所有属性,但其 3d 位置数组除外。我在这里 (Randomly shuffle columns except first column) 遇到过类似的问题,但是,有没有一种简单快速的 Pythonic 方法可以在不使用 DataFrame 的情况下做到这一点?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

如果您使用的是 pandas,则只需随机排列一列:

df['col'] = df['col'].sample(frac=1).values

这同样适用于任何列子集,例如

cols = ['col1', 'col2']
df[cols] = df[cols].sample(frac=1).values

这两列混在一起,即它们各自的值保持对齐。

另见this answer。

【讨论】:

谢谢 Kris,如果我想同时打乱两列,这意味着在打乱列时任何行的对应值保持在一起怎么办? @Ash 看看更新后的答案。这就是你的想法吗?【参考方案2】:

您可以实现 Knuth shuffle (https://en.wikipedia.org/wiki/Random_permutation),它非常简单。

您可以调整实现算法以仅交换您想要的属性。

【讨论】:

谢谢。该页面是用 C 语言编写的。不幸的是,我不熟悉C。但是,我会尝试理解它。 这里是 [[ -36.12 -51.06 222.9 ] [-211.2 21.56 215.1 ] [-215.3 -36.88 175.9 ] ... [ 181.9 53.9 185.1 ] [ 145.1 156.4 159. ] [ -16.59 11.52 165.8 ]] ,这是随机播放后的格式 [list([9.32, 6.92, -9.669]) list([67.61, 116.6, 35.13]) list([149.4, 107.3, 159.8]) .. . list([79.3, -44.27, 0.03649]) list([19.0, -13.63, -16.86]) list([140.0, -177.1, 104.0])]。你能帮我修复它,让我之后得到相同的格式吗?

以上是关于如何通过保留除一个以外的所有属性来随机打乱种群?的主要内容,如果未能解决你的问题,请参考以下文章

php保留键随机打乱数组顺序

如何制作 Java 文件阅读器

如何使用正则表达式 python3 替换除空格和换行符旁边的数字以外的所有其他符号

混淆/屏蔽/加扰个人信息

如何打乱一组数的顺序?

R 正则表达式替换除句子标记、撇号和连字符以外的所有标点符号