假设:
-
每一个元素
value_list
将出现在
key_list
(在某个位置或另一个位置)
-
我们对里面的索引感兴趣
密钥列表
,只有
第一
比赛
解决方案:
从这两个数组中,我们创建3元组的视图。然后,我们在两个正交方向上广播这两个视图,然后检查广播数组上的元素相等性。
import numpy as np
value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]], dtype='uint8')
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]], dtype='uint8')
# Define a new dtype, describing a "structure" of 3 uint8's (since
# your original dtype is uint8). To the fields of this structure,
# give some arbitrary names 'first', 'sec', and 'third'
dt = np.dtype([('first', np.uint8, 1),('sec', np.uint8, 1),('third', np.uint8, 1)])
# Now view the arrays as 1-d arrays of 3-tuples, using the dt
v_value_list = value_list.view(dtype=dt).reshape(value_list.shape[0])
v_key_list = key_list.view(dtype=dt).reshape(key_list.shape[0])
result = np.argmax(v_key_list[:,None] == v_value_list[None,:], axis=0)
print (result)
输出:
[0, 1, 0, 2]
笔记:
-
尽管这是一个没有任何可见循环的纯numpy解决方案,但它可能隐藏了低效性,因为它匹配
价值列表
每一个元素
密钥列表
,而基于循环的搜索则在第一次成功匹配时智能地停止。获得的任何优势将取决于
密钥列表
,并根据成功匹配的位置,
密钥列表
. 大小为
密钥列表
增长,可能会有一些核优势的侵蚀,特别是如果成功的比赛大多发生在
密钥列表
.
-
我们正在创建的视图实际上是numpy结构的数组,其中视图的每个元素都是由两个
int
有一个有趣的问题,我还没有探讨过,当numpy比较一个结构和另一个结构时,它是对结构中的每个字段进行比较,还是在结构的第一个失败字段处使字段比较短路?任何这样的短循环都可能意味着此结构化阵列解决方案有一个小小的附加优势。