<p>注意-这可能与@Mad的答案重叠;我会留下它,以防另一种解释澄清了一些困惑</p>
<pre><code>In [32]: numList = [[0, 32, 84, 93, 1023, -1], [0, 23, 33, 45, -1, -1], [0, 10, 15, 21, 2
...: 4, 25], [0, 23, -1, -1, -1, -1], [0 , 13, 33, 34, -1, -1]]
...: numArray = np.array(numList)
In [33]: numArray
Out[33]:
array([[ 0, 32, 84, 93, 1023, -1],
[ 0, 23, 33, 45, -1, -1],
[ 0, 10, 15, 21, 24, 25],
[ 0, 23, -1, -1, -1, -1],
[ 0, 13, 33, 34, -1, -1]])
</code></pre>
<p>每行的焊盘数量:</p>
<pre><code>In [34]: np.sum(numArray==-1, axis=1)
Out[34]: array([1, 2, 0, 4, 2])
</code></pre>
<p>每行非焊盘的数量:</p>
<pre><code>In [35]: np.sum(numArray!=-1, axis=1)
Out[35]: array([5, 4, 6, 2, 4])
</code></pre>
<p>我不知道假设pad值都在末尾,这是否会提高效率。样本有点小,不能很好地进行计时</p>
<p>从每一行中随机选取一个非pad,显然第一次尝试是一个行列表:</p>
<pre><code>In [40]: [np.random.choice(row[row!=-1]) for row in numArray]
Out[40]: [32, 0, 0, 23, 34]
</code></pre>
<p>或者根据长度(如上所述)(并假设尾部填充),我们可以为每行选择一个随机索引:</p>
<pre><code>In [46]: [np.random.choice(i) for i in Out[35]]
Out[46]: [1, 2, 1, 0, 1]
In [47]: numArray[np.arange(numArray.shape[0]), [np.random.choice(i) for i in Out[35]]]
Out[47]: array([93, 45, 21, 23, 13])
</code></pre>
<p>在@Mad的帽子提示中,<code>randint</code>接受范围值的列表/数组,<code>choice</code>理解可以替换为:</p>
<pre><code>In [49]: np.random.randint(Out[35])
Out[49]: array([3, 1, 2, 1, 1])
In [50]: numArray[np.arange(numArray.shape[0]), np.random.randint(Out[35])]
Out[50]: array([ 0, 23, 24, 0, 0])
</code></pre>