np.where返回元组列表的空索引

时间:2019-06-20 20:15:32

标签: python numpy

谁能告诉我如何修复以下代码? np.where应该返回索引0。

import numpy as np
listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
np.where(listoftups==("a", "b"))

3 个答案:

答案 0 :(得分:4)

np.where(('a','b') in listoftups)

您的代码中的内容返回false

>>> listoftups==("a", "b")
False

位置

>>> ('a','b') in listoftups
True

答案 1 :(得分:2)

假定您要查找元组的索引。这是不需要numpy的解决方案。

listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
search_tuple = ("a", "b")
print(listoftups.index(search_tuple))

将返回0

search_tuple = ("f", "g")
print(listoftups.index(search_tuple))

将返回3

答案 2 :(得分:0)

以下是强制numpy执行您想要的操作的方法:

listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
  1. where在布尔数组上运行,如果a或b是一个numpy数组,则类似a == b的比较将创建一个布尔数组,但如果两个都是本地python对象,则不是。让我们还创建一个示例,其中包含两个搜索元组。

arroftups = np.array(listoftups)
twice = np.concatenate(2*[listoftups])
  1. 一个小的挑战是,当numpy看到两个元素测试元组时,它会阻止尝试广播。我们可以通过将其封装在0d数组中来实现

probe = np.empty((),object)
probe[()] = "a", "b"
  1. 现在我们很好:

np.where(arroftups==probe)
# (array([0]),)
np.where(twice==probe)
# (array([0, 4]),)

请注意,如果您确定确实有一个测试元组出现,那么@ Watchdog101的解决方案可能更好。但这在一般情况下不起作用。