Python Numpy:基于bool数组拾取元素

Python Numpy:基于bool数组拾取元素,python,arrays,numpy,mask,Python,Arrays,Numpy,Mask,我有一个数组和一个布尔数组(作为一个热编码) a=np.arange(12)。重塑(4,3) b=np.array([ [1,0,0], [0,1,0], [0,0,1], [0,0,1], ],dtype=bool) 印刷品(a) 印刷品(b) # [[ 0 1 2] # [ 3 4 5] # [ 6 7 8] # [ 9 10 11]] #[[真假假] #[假-真-假] #[假-假-真] #[假-假-真]] 我想用一个布尔数组来选择元素 打印(a[:,[True,Fals

我有一个数组和一个布尔数组(作为一个热编码)

a=np.arange(12)。重塑(4,3)
b=np.array([
[1,0,0],
[0,1,0],
[0,0,1],
[0,0,1],
],dtype=bool)
印刷品(a)
印刷品(b)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]
#[[真假假]
#[假-真-假]
#[假-假-真]
#[假-假-真]]
我想用一个布尔数组来选择元素

打印(a[:,[True,False,False]]
#数组([[0],
#        [3],
#        [6],
#        [9]])
打印(a[:,[False,True,False]]
#数组([[1],
#        [ 4],
#        [ 7],
#        [10]])
但这将基于所有行的相同模板布尔值进行拾取。我希望在每行的基础上执行此操作:

打印(a[:,b]) #索引器:数组的索引太多 我应该在
中输入什么,以便得到:

打印(a[:,…]) #数组([[0], # [4], # [8], # [11]]) 编辑:这与臭名昭著的课程中使用的内容类似:

dscores=a
num_示例=4
#他们有300人
y=b
dscores[范围(num_示例),y]
#相当于
#a{,b]
编辑2:在示例中,
y
是一维的,不是热编码的


在通过
b
广播过滤后,他们正在做
dscores[[rowIdx],[columnIdx]]

a[b][:,None]
Out[168]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])


这是一种替代方法。请注意,与高级索引相比,这是低效的。这只是出于教学目的,并说明可以使用多种方法解决问题

In [275]: np.add.reduce(a*b, axis=1, keepdims=True)
Out[275]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])

我试图从中理解
dscores[range(num_示例),y]-=1
,这是当时的旧语法?@SaravanabalagiRamachandran我觉得y是一维数组,对吗?哦,是的,对不起,我以为它们有一个热编码!它们确实是一维的
In [275]: np.add.reduce(a*b, axis=1, keepdims=True)
Out[275]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])