2012-09-02 130 views
4

当使用Python的逻辑运算符,我想二维numpy的阵列上执行切片:切片一个numpy的阵列

type1_c = type1_c[ 
    (type1_c[:,10]==2) or 
    (type1_c[:,10]==3) or 
    (type1_c[:,10]==4) or 
    (type1_c[:,10]==5) or 
    (type1_c[:,10]==6) 
] 

语法是正确的;但是我收到以下错误消息: '具有多个元素的数组的真值是不明确的。使用a.any()或a.all()'

我真的不明白发生了什么问题。任何想法?

回答

7

or当它在两个标量之间时是明确的,但什么是正确的向量泛化?如果x == array([0, 0])y == array([0,1]),应该x or y是:(1)假的,因为不是所有的两两方面or -ed在一起是真的,(2)真,因为至少有一个成对or结果为真,(3)array([0, 1]),因为这是成对结果or,(4)array([0, 0]),因为[0,0] or [0,1]会返回[0,0],因为非空列表是真的,所以应该是array

你可以使用|这里,并把它当作位问题:

>>> import numpy as np 
>>> vec = np.arange(10) 
>>> vec[(vec == 2) | (vec == 7)] 
array([2, 7]) 

明确使用numpy小号矢量逻辑或:

>>> np.logical_or(vec==3, vec==5) 
array([False, False, False, True, False, True, False, False, False, False], dtype=bool) 
>>> vec[np.logical_or(vec==3, vec==5)] 
array([3, 5]) 

或使用in1d,远远这里更有效:

>>> np.in1d(vec, [2, 7]) 
array([False, False, True, False, False, False, False, True, False, False], dtype=bool) 
>>> vec[np.in1d(vec, [2, 7])] 
array([2, 7])