Numpy:根据bool数组选择元素

问题描述 投票:1回答:2

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

a = np.arange(12).reshape(4,3)
b = np.array([
    [1,0,0],
    [0,1,0],
    [0,0,1],
    [0,0,1],
], dtype=bool)

print(a)
print(b)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]
# [[ True False False]
#  [False  True False]
#  [False False  True]
#  [False False  True]]

我想使用布尔数组选择元素

print(a[:, [True, False, False]])
# array([[0],
#        [3],
#        [6],
#        [9]])

print(a[:, [False, True, False]])
# array([[ 1],
#        [ 4],
#        [ 7],
#        [10]])

但是这个选择基于所有行的相同模板布尔值。我想以每行为基础执行此操作:

print(a[:, b])
# IndexError: too many indices for array

我应该把什么放在...所以我得到:

print(a[:, ...])
# array([[0],
#        [4],
#        [8],
#        [11]])

编辑:这类似于臭名昭着的CS231课程中使用的:

dscores = a
num_examples = 4 
# They had 300
y = b
dscores[range(num_examples),y]
# equivalent to
# a{:,b]

编辑2:在CS231示例中,y是一维的,并不是一个热编码!

他们在做dscores[[rowIdx],[columnIdx]]

python arrays numpy mask
2个回答
3
投票

b过滤后播出

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

要么

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

0
投票

这是另一种做同样的方法。请注意,与高级索引相比,这是低效的。它仅用于教学目的,并说明可以使用多种方法解决问题。

In [275]: np.add.reduce(a*b, axis=1, keepdims=True)
Out[275]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])
© www.soinside.com 2019 - 2024. All rights reserved.