<p>如果需要两个值,只需告诉<code>numpy.random.choice()</code>选取两个值;在循环时将<code>el</code>值作为元组包含(无需使用<code>zip()</code>):</p>
<pre><code>tuples = []
for el in elements:
for chosen in choice(elements, size=2, replace=False, p=weights):
tuples.append((el, chosen))
</code></pre>
<p>或者使用列表理解:</p>
<pre><code>tuples = [(el, chosen) for el in elements
for chosen in choice(elements, size=2, replace=False, p=weights)]
</code></pre>
<p>通过设置<code>replace=False</code>,可以得到唯一的值;删除它或显式地将其设置为<code>True</code>,以允许重复。参见<a href="https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.random.choice.html#numpy.random.choice" rel="nofollow noreferrer">^{<cd1>} documentation</a>:</p>
<blockquote>
<p><strong>size</strong> : <em>int or tuple of ints, optional</em><br/>
Output shape. If the given shape is, e.g., <code>(m, n, k)</code>, then <code>m * n * k</code> samples are drawn. Default is <code>None</code>, in which case a single value is returned.</p>
<p><strong>replace</strong> : <em>boolean, optional</em><br/>
Whether the sample is with or without replacement</p>
</blockquote>
<p>演示:</p>
<pre><code>>>> from numpy.random import choice
>>> elements = ['one', 'two', 'three']
>>> weights = [0.2, 0.3, 0.5]
>>> tuples = []
>>> for el in elements:
... for chosen in choice(elements, size=2, replace=False, p=weights):
... tuples.append((el, chosen))
...
>>> tuples
[('one', 'three'), ('one', 'one'), ('two', 'three'), ('two', 'two'), ('three', 'three'), ('three', 'two')]
>>> [(el, chosen) for el in elements for chosen in choice(elements, size=2, replace=False, p=weights)]
[('one', 'one'), ('one', 'three'), ('two', 'one'), ('two', 'three'), ('three', 'two'), ('three', 'three')]
</code></pre>