python - 使用另一个列表 python 从列表创建索引值数组

标签 python image numpy indexing

我有一个值数组以及另一个我想为其创建索引的数组。 例如:

value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]])
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]])
MagicFunction(value_list,key_list)
#result = [[0,1,0,2]] which has the same length as value_list

我在研究后在网上看到的解决方案并不完全是我所要求的,我相信,任何帮助将不胜感激! 我有这个提供结果的强力代码,但我什至不想在我的实际数据大小上测试它

T = np.zeros((len(value_list)), dtype = np.uint32)
for i in range(len(value_list)):
    for j in range(len(key_list)):
        if sum(value_list[i] == key_list[j]) == 3:
            T[i] = j

最佳答案

问题是如何让它不那么低效。我看到两种方法

  1. 使用字典以便查找速度更快。 numpy 数组是可变的,因此不可散列,因此您必须将它们转换为例如与字典一起使用的元组。

  2. 使用广播以矢量化方式检查 value_listkey_list 中的每个“键”。这至少会将 for 循环带出 Python,但您仍然必须将每个值与每个键进行比较。

我在这里也假设key_list只有唯一的“键”。

以下是第一种方法的方法:

value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]])
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]])

key_map = {tuple(key): i for i, key in enumerate(key_list)}
result = np.array([key_map[tuple(value)] for value in value_list])
result # array([0, 1, 0, 2])

这是第二个:

result = np.where((key_list[None] == value_list[:, None]).all(axis=-1))[1]
result # array([0, 1, 0, 2])

哪种方式更快可能取决于key_listvalue_list的大小。我会为您计算典型大小的数组的时间。

编辑 - 正如评论中所述,第二个解决方案似乎并不完全正确,但我不确定是什么导致它失败。考虑改用第一个解决方案。

关于python - 使用另一个列表 python 从列表创建索引值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54965049/

相关文章:

python - 复制numpy数组的速度

python - 使用分组依据转换数据框并包含额外的列值

python - 是否有 Python MySQL API 返回准备好的语句以供重用?

javascript - Joomla 2.5.7 删除了代码

html - Bootstrap 3 溢出容器中的文本覆盖英雄图像

html - div 中的文本显示在 div 的顶部而不是中间

python - 如何修复sketch_rnn算法中的 'Object arrays cannot be loaded when allow_pickle=False'

python - 如何从列表元素中删除\n?

python - 将 numpy 数组中的值可视化为位图中的颜色

python - python中的条件求和