我在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'
但这不起作用。如何检测tuple
中where函数返回的numpy
是否为空?是因为我的一个变量可能是错误的类型?我是python
的新人,也是一般的编程。
答案 0 :(得分:11)
命名法:
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
。
答案 1 :(得分:3)
您的测试失败,因为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!')