在numpy中使用布尔数组索引会导致ValueError

时间:2014-11-27 14:39:46

标签: python-3.x numpy indexing boolean

我正在尝试使用布尔数组进行索引

def boolean_array_indexing_each_dim1():
    a = np.array(
                 [
                  ['a','b','c','d'],
                  ['e','f','g','h'],
                  ['i','j','k','l'],
                  ['m','n','o','p']
                  ]
                 )
    print('a=\n',a.shape,'\n',a)
    b1 = np.array([True,True,True,False]) #gives error
    #b1 = np.array([True,False,True,False]) #works
    print('b1=\n',b1.shape,'\n',b1)
    b2 = np.array([True,False,True,False])
    print('b2=\n',b2.shape,'\n',b2)  
    selected = a[b1,b2]
    print('selected=\n',selected.shape,'\n',selected)

数组b1 = np.array([True,True,True,False])会导致ValueError形状不匹配:无法将对象广播为单个形状'

然而,数组b1 = np.array([True,False,True,False])起作用并产生结果' ['一个' ' K']'

为什么会发生这种错误?有谁可以告诉?

1 个答案:

答案 0 :(得分:2)

原因是您的第一个b1数组有3个True值,第二个数组有2个True值。这相当于分别按[0,1,2], [0,2]索引。通过从b1b2数组中的位置序列构造索引对,Numpy的索引“起作用”。对于[0,1,2], [0,2]的情况,它会构建索引对(0,0), (1,2)但是2中的最终b1没有合作伙伴,因此它会引发ValueError。您的候补b1有效,因为它恰好与True具有相同数量的b2值。

我怀疑你打算完成的是

selected = a[b1,:][:,b2]

这将沿着轴0始终用b1对数组进行切片,然后沿着轴1用b2对其进行切片。