【问题标题】:How to split a set of strings into substrings in Python, making shorter substrings more likely?如何在 Python 中将一组字符串拆分为子字符串,使更短的子字符串更有可能?
【发布时间】:2019-04-26 08:51:15
【问题描述】:

我有一组字符串,每个字符串都有数百万个字符。我想将它们分成随机长度的子字符串,这我可以毫无问题地做到。

但是,我的问题是:如何对子字符串长度选择应用某种权重?我的代码在python3 中运行,所以我想找到一个pythonic 解决方案。具体来说,我的目标是:

  • 将字符串拆分为长度介于 1*e04 和 8*e06 字符之间的子字符串。
  • 让脚本更频繁地为新生成的子字符串选择短长度 (1*e04) 而不是长长度 (8*e06),例如降序长度似然梯度。

感谢您的帮助!

【问题讨论】:

    标签: python string random gradient


    【解决方案1】:

    NumPy 提供大量random 采样功能。查看各种可用的distributions

    如果您正在寻找权重偏低的东西,也许exponential distribution 会起作用?

    使用matplotlib,您可以绘制值的直方图,以便更好地了解分布是否符合您的要求。

    所以是这样的:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # desired range of values
    mn = 1e04
    mx = 8e06
    
    # random values following exp distribution
    values = np.random.exponential(scale=1, size=2000)
    
    # scale the values to the desired range
    values = ((mx-mn)*values/np.max(values)) + mn
    
    # plot the distribution of values
    plt.hist(values)
    plt.grid()
    plt.show()
    plt.close()
    

    【讨论】:

      【解决方案2】:

      可能有很多方法可以做到这一点。我会这样做:

      1. 在区间[0,1]中取一个随机数rand
        import random
        rand = random.random()
      2. 对该数字进行操作以使较小的数字更有可能,但请保持在[0,1] 的范围内。您使用什么操作取决于您希望似然分布的样子。一个简单的选择是正方形。
        rand = rand**2
      3. 将数字空间[0,1] 缩放到[1e04, 8e06] 并舍入到下一个整数:
        subStringLen = round(rand*(8e06-1e04)+1e04)
      4. 从您的字符串中获取长度为subStringLen 的子字符串并检查剩余的字符数。
        • 如果剩余的字符数超过8e06,请转到第 1 步。
        • 如果1e048e06 之间存在,请将它们用作最后​​一个子字符串。
        • 如果小于1e04,您需要决定在这种特殊情况下是要丢弃其余的还是允许小于1e04 的子字符串。

      我确信在效率方面有很多改进可能,这只是为了让您了解我的方法。

      【讨论】:

        猜你喜欢
        • 2019-07-26
        • 1970-01-01
        • 2015-12-28
        • 2011-11-25
        • 1970-01-01
        • 2017-06-27
        • 2014-09-26
        • 2015-01-16
        相关资源
        最近更新 更多