Numpy:基于bool数组拾取元素

2024-09-27 23:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]]


Tags: falsetrue编辑编码np数组arrayexamples
2条回答

这里有另一种方法。请注意,与高级索引相比,这是低效的。这只是为了教学目的,并说明一个问题可以解决使用多种方法。你知道吗

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

经过过滤后b广播它

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

或者

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

相关问题 更多 >

    热门问题