2014-04-29 83 views
3

我使用numpy中的where函數在字符串數組中尋找單字母字符串。 例如: 我會尋找'U'['B' 'U' 'A' 'M' 'R' 'O']並獲得索引'U'爲什麼我無法檢測到元組是空的?

letter = 'U' 
row = ['B', 'U', 'A', 'M', 'R', 'O'] 
letter_found = np.where(row == letter) 

然而,當我在尋找一個字母是不存在的字符串數組中我得到一個空的元組,看起來像這樣:

(array([], dtype=int64),) 

我需要能夠在檢測到它沒有找到我在數組中查找的字母。

我已經試過如下:

if not letter_found: 
    print 'not found' 

但是,這是行不通的。如何檢測numpy中的where函數返回的tuple爲空?是否因爲我的一個變量可能是錯誤的類型?我在python和編程一般新。

回答

9

的nomeclature:

if some_iterable: 
    #only if non-empty 

只有當事情是空的作品。在你的情況下,元組實際上不是空的。元組包含的內容是空的。所以,你可能要做到以下幾點:

if any(map(len, my_tuple)): 
    #passes if any of the contained items are not empty 

len在一個空迭代將產生0,因此將被轉換爲False

+0

不需要'地圖(LEN ...'這裏,只是'任何(my_tuple)'應該做的伎倆 – SingleNegationElimination

+1

我不知道是否只是'任何! (my_tuple)'將適用於這種特定的情況,因爲元組的元素是'numpy'數組,並且不能直接在布爾上下文中使用。 – lmjohns3

2

您的測試失敗,因爲letter_found實際上是包含一個元素的元組,因此它不是空的。 numpy.where返回索引值的元組,每個元素對應於您正在測試的數組中的每個維度。使用此爲一維數組搜索通常情況下,我使用Python的元組拆包,避免只是這種情況:

letter = 'U' 
row = ['B', 'U', 'A', 'M', 'R', 'O'] 
letter_found, = np.where(row == letter) 

注意letter_found後的逗號。這將從numpy.where中解壓縮結果並將letter_found分配爲該元組的第一個元素。

還要注意,letter_found現在將引用一個numpy數組,它不能在布爾上下文中使用。你必須做一些事情,如:

if len(letter_found) == 0: 
    print('not found!') 
+0

此方法提供了「解包太多值」錯誤 –

相關問題