<p>使用NumPy有一种方法可以实现这一点,<a href="https://docs.python.org/3/library/itertools.html#itertools.repeat" rel="nofollow noreferrer">itertools</a>提供了一个微小的循环加速:</p>
<pre><code>from itertools import repeat
import numpy as np
def gen_chunk(high=5):
"""Example: gen_chunk(high=6) > array(['n', 'n', 'n', 'd']"""
return np.append(np.repeat('n', np.random.randint(low=2, high=high)), 'd')
def gen_series(chunks=3, high=5):
return np.concatenate([gen_chunk(high=high) for _ in repeat(None, 3)])
df = pd.DataFrame(gen_series())
</code></pre>
<p>演练:</p>
<p>您可以独立地生成由2个或多个N后跟1个D组成的每个“块”。这就是上面<code>get_chunk()</code>所做的。在本例中,它生成一个N的NumPy数组,后跟1 D,其中N的个数是一个介于2和<code>high</code>参数之间的随机整数。你知道吗</p>
<p>然后在<code>gen_series()</code>中,您可以构建单独的块(其中3个是这里的默认值)并将它们连接到单个1d数组中。你知道吗</p>
<p><strong>更新</p>
<p>上面在每个块的生成中使用一个常量<code>high</code>参数。也许这不符合你正在寻找的psueorandom的定义。要对每个块生成使用不同的<code>high</code>,可以执行以下操作:</p>
<pre><code>def gen_series(chunks, max_high):
"""Use a randomly selected `high` value for each chunk."""
highs = np.random.randint(low=3, high=max_high, size=chunks)
return np.concatenate([gen_chunk(high=high) for high in highs])
</code></pre>
<p>任何一种施工都应该相当快:</p>
<pre><code>%timeit gen_series(chunks=1000, high=10)
# 36.9 µs ± 1.93 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
</code></pre>