<p>假设您有足够的内存来保存布尔掩码(原始数组和新数组的形状),下面是一种方法:</p>
<pre><code>import numpy as np
def main():
np.random.seed(1) # For reproducibility
data = generate_data((10, 6))
indices = rightmost_min_col(data)
new_data = pop_col(data, indices)
print 'Original data...'
print data
print 'Modified data...'
print new_data
def generate_data(shape):
return np.random.randint(0, 10, shape)
def rightmost_min_col(data):
nrows, ncols = data.shape[:2]
min_indices = np.fliplr(data).argmin(axis=1)
min_indices = (ncols - 1) - min_indices
return min_indices
def pop_col(data, col_indices):
nrows, ncols = data.shape[:2]
col_indices = col_indices[:, np.newaxis]
row_indices = np.arange(ncols)[np.newaxis, :]
mask = col_indices != row_indices
return data[mask].reshape((nrows, ncols-1))
if __name__ == '__main__':
main()
</code></pre>
<p>这就产生了:</p>
^{pr2}$
<p>我在这里使用的一个不太可读的技巧是在数组比较期间利用numpy的广播。作为一个简单的例子,请考虑以下内容:</p>
<pre><code>import numpy as np
a = np.array([[1, 2, 3]])
b = np.array([[1],[2],[3]])
print a == b
</code></pre>
<p>这就产生了:</p>
<pre><code>array([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
</code></pre>
<p>因此,如果我们知道要删除的项的列索引,就可以对列索引数组的操作进行向量化,这正是<code>pop_col</code>所做的。在</p>