使用布尔索引就地修改numpy数组部分

时间:2012-09-15 12:11:59

标签: python numpy

给定2D numpy数组,即。;

import numpy as np

data = np.array([
     [11,12,13],
     [21,22,23],
     [31,32,33],
     [41,42,43],         
     ])

我需要根据所需行和列的两个屏蔽向量修改子数组;

rows = np.array([False, False, True, True], dtype=bool)
cols = np.array([True, True, False], dtype=bool)

这就是那样;

print data

 #[[11,12,13],
 # [21,22,23],
 # [0,0,33],
 # [0,0,43]]      

1 个答案:

答案 0 :(得分:7)

Now您知道如何访问所需的行/列,只需将您想要的值分配给子阵列。但是,这有点棘手:

mask = rows[:,None]*cols[None,:]
data[mask] = 0

原因是当我们以data[rows][:,cols]的形式访问子数据时(如previous question所示),我们正在查看视图,并且对原始数据的一些引用会在方式。

相反,在这里我们通过将两个1D数组rowscols一个广播到另一个来构建一个2D布尔数组。您的mask数组现在的形状为(len(rows),len(cols)。我们可以使用mask直接访问data的原始项,然后将它们设置为新值。请注意,当您执行data[mask]时,您会获得一维数组,这不是您在previous question中想要的答案。

要构造掩码,我们可以使用&运算符而不是*(因为我们处理的是布尔数组)或更简单的np.outer函数:

mask = np.outer(rows,cols)

编辑:为np.outer解决方案向@Marcus Jones提供道具。