如何将一组字符串拆分为 Python 中的子字符串,使更短的子字符串更有可能?
How to split a set of strings into substrings in Python, making shorter substrings more likely?
我有一组字符串,每个字符串都有数百万个字符。我想将它们拆分成随机长度的子字符串,我可以毫无问题地做到这一点。
但是,我的问题是:如何对子串长度选择应用某种权重?我的代码在 python3
中运行,所以我想找到一个 pythonic 解决方案。具体来说,我的目标是:
- 将字符串拆分为长度在 1*e04 到 8*e06 个字符之间的子字符串。
- 让脚本更频繁地为新生成的子字符串选择较短的长度 (1*e04) 而不是较长的长度 (8*e06),如递减长度似然梯度。
感谢您的帮助!
可能有很多方法可以做到这一点。我会这样做:
- 在
[0,1]
区间取一个随机数rand
:
import random
rand = random.random()
- 对该数字进行操作,使更小的数字更有可能,但保持在
[0,1]
的范围内。您使用什么操作取决于您希望似然分布的样子。一个简单的选择是正方形。
rand = rand**2
- 将数字 space
[0,1]
缩放到 [1e04, 8e06]
并四舍五入到下一个整数:
subStringLen = round(rand*(8e06-1e04)+1e04)
- 从您的字符串中获取长度为
subStringLen
的子字符串并检查剩余的字符数。
- 如果剩余的字符超过
8e06
个,请转到第 1 步。
- 如果介于
1e04
和 8e06
之间,请将它们用作最后一个子字符串。
- 如果少于
1e04
,您需要决定是否要丢弃其余部分,或者在这种特殊情况下允许小于 1e04
的子字符串。
我确信在效率方面有很多改进的可能,这只是为了让您了解我的方法。
NumPy
提供大量 random samping functions. Have a look through the various 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()
我有一组字符串,每个字符串都有数百万个字符。我想将它们拆分成随机长度的子字符串,我可以毫无问题地做到这一点。
但是,我的问题是:如何对子串长度选择应用某种权重?我的代码在 python3
中运行,所以我想找到一个 pythonic 解决方案。具体来说,我的目标是:
- 将字符串拆分为长度在 1*e04 到 8*e06 个字符之间的子字符串。
- 让脚本更频繁地为新生成的子字符串选择较短的长度 (1*e04) 而不是较长的长度 (8*e06),如递减长度似然梯度。
感谢您的帮助!
可能有很多方法可以做到这一点。我会这样做:
- 在
[0,1]
区间取一个随机数rand
:import random rand = random.random()
- 对该数字进行操作,使更小的数字更有可能,但保持在
[0,1]
的范围内。您使用什么操作取决于您希望似然分布的样子。一个简单的选择是正方形。rand = rand**2
- 将数字 space
[0,1]
缩放到[1e04, 8e06]
并四舍五入到下一个整数:subStringLen = round(rand*(8e06-1e04)+1e04)
- 从您的字符串中获取长度为
subStringLen
的子字符串并检查剩余的字符数。- 如果剩余的字符超过
8e06
个,请转到第 1 步。 - 如果介于
1e04
和8e06
之间,请将它们用作最后一个子字符串。 - 如果少于
1e04
,您需要决定是否要丢弃其余部分,或者在这种特殊情况下允许小于1e04
的子字符串。
- 如果剩余的字符超过
我确信在效率方面有很多改进的可能,这只是为了让您了解我的方法。
NumPy
提供大量 random samping functions. Have a look through the various 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()