<p><code>compress</code>与许多<code>numpy</code>缩减函数一样,采用轴参数:</p>
<pre><code>In [166]: np.compress(u,square_matrix, axis=1)
Out[166]:
array([[ 1, 3],
[ 5, 7],
[ 9, 11],
[13, 15]])
In [167]: np.compress(u,square_matrix, axis=0)
Out[167]:
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
</code></pre>
<p>按顺序应用压缩:</p>
<pre><code>In [168]: np.compress(u,np.compress(u,square_matrix, axis=0),axis=1)
Out[168]:
array([[ 1, 3],
[ 9, 11]])
</code></pre>
<p>我没有意识到<code>np.compress</code>的存在,尽管从源文件来看,它一定从一开始就存在。布尔索引是相同的,而且更常见</p>
<pre><code>In [169]: bu = u.astype(bool)
In [170]: square_matrix[bu,:]
Out[170]:
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
In [171]: square_matrix[:,bu]
Out[171]:
array([[ 1, 3],
[ 5, 7],
[ 9, 11],
[13, 15]])
</code></pre>
<p>布尔索引相当于使用<code>nonzero</code>结果进行索引:</p>
<pre><code>In [177]: np.nonzero(u)
Out[177]: (array([0, 2]),)
In [178]: idx = np.nonzero(u)[0]
In [179]: square_matrix[idx,:]
Out[179]:
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
</code></pre>
<p>并且可以同时应用于两个维度:</p>
<pre><code>In [180]: square_matrix[idx[:,None],idx]
Out[180]:
array([[ 1, 3],
[ 9, 11]])
</code></pre>
<p>如果不进行重塑(使第一个列成为一列),我们将得到对角线:</p>
<pre><code>In [181]: square_matrix[idx,idx]
Out[181]: array([ 1, 11])
</code></pre>
<p>并使用<code>ix_</code>实用程序:</p>
<pre><code>In [185]: np.ix_(bu,bu)
Out[185]:
(array([[0],
[2]]),
array([[0, 2]]))
In [186]: square_matrix[np.ix_(bu,bu)]
Out[186]:
array([[ 1, 3],
[ 9, 11]])
</code></pre>