<p>有关2D阵列的具体问题的简短答案是:</p>
<pre><code>np.where(x >= np.transpose(x), 1, 0)
</code></pre>
<p>但要进一步推动这一点,您需要除<code>tile</code>之外的工具。准备样本空间的自然方法是<code>meshgrid</code>:</p>
<pre><code>die = np.arange(1, 7)
a, d = np.meshgrid(die, die)
</code></pre>
<p>现在<code>a</code>和<code>d</code>是2d数组,包含攻击者和防御者的得分。与前面一样,<code>np.where(a <= d, 1, 0)</code>生成一个1-0表(前一个表的转置,但这是选择的问题)。你知道吗</p>
<p>让我们看看每个人掷两个骰子会发生什么:</p>
<pre><code>a1, a2, d1, d2 = np.meshgrid(die, die, die, die)
</code></pre>
<p>这是防守队员第一轮获胜的地方(比较最高得分):</p>
<pre><code>np.where(np.maximum(a1, a2) <= np.maximum(d1, d2), 1, 0)
</code></pre>
<p>下面是最低分的比较,最低分是第二高分:</p>
<pre><code>np.where(np.minimum(a1, a2) <= np.minimum(d1, d2), 1, 0)
</code></pre>
<p>两者都是4D阵列,因为样本空间是四维的。你知道吗</p>
<p>当有人掷3个或更多骰子时,事情会变得更复杂,因为“第二高”的选择不像“最大”那样简单。可以通过堆叠玩家的骰子并沿新轴排序,然后切片来完成:</p>
<pre><code>a1, a2, a3, d1, d2 = np.meshgrid(die, die, die, die, die) # 3-2 roll
attack = np.stack([a1,a2,a3]) # stack attacker into a 6D array
attack.sort(axis=0) # sort their scores
attack_max = attack[-1,:,:,:,:,:] # maximum score
attack_2nd = attack[-2,:,:,:,:,:] # 2nd highest attack score
</code></pre>
<p>现在我们像以前一样比较:</p>
<pre><code>defender_wins_1 = np.where(attack_max <= np.maximum(d1, d2), 1, 0)
defender_wins_2 = np.where(attack_2nd <= np.minimum(d1, d2), 1, 0)
</code></pre>