2012-09-02 160 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])