我有一个值数组以及另一个我想为其创建索引的数组。 例如:
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
最佳答案
问题是如何让它不那么低效。我看到两种方法
使用字典以便查找速度更快。
numpy
数组是可变的,因此不可散列,因此您必须将它们转换为例如与字典一起使用的元组。使用广播以矢量化方式检查
value_list
与key_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_list
和value_list
的大小。我会为您计算典型大小的数组的时间。
编辑 - 正如评论中所述,第二个解决方案似乎并不完全正确,但我不确定是什么导致它失败。考虑改用第一个解决方案。
关于python - 使用另一个列表 python 从列表创建索引值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54965049/