我使用字典替换数组列表的值存在性能问题。
让我们说这是我的字典:
# Create a sample dictionary
keys = [1, 2, 3, 4]
values = [5, 6, 7, 8]
dictionary = dict(zip(keys, values))
这是我的数组列表:
# import numpy as np
# List of arrays
listvalues = []
arr1 = np.array([1, 3, 2])
arr2 = np.array([1, 1, 2, 4])
arr3 = np.array([4, 3, 2])
listvalues.append(arr1)
listvalues.append(arr2)
listvalues.append(arr3)
listvalues
>[array([1, 3, 2]), array([1, 1, 2, 4]), array([4, 3, 2])]
然后我使用以下函数使用字典替换nD numpy数组中的所有值:
# Replace function
def replace(arr, rep_dict):
rep_keys, rep_vals = np.array(list(zip(*sorted(rep_dict.items()))))
idces = np.digitize(arr, rep_keys, right=True)
return rep_vals[idces]
这个函数非常快,但我需要遍历我的数组列表以将此函数应用于每个数组:
replaced = []
for i in xrange(len(listvalues)):
replaced.append(replace(listvalues[i], dictionary))
这是该过程的瓶颈,因为它需要迭代数千个阵列。
如果不使用for-loop,我怎么能达到相同的效果?重要的是结果与输入格式相同(具有替换值的数组列表)
非常感谢你们!
答案 0 :(得分:2)
这将使用numpy_indexed包有效地解决问题。如果'listvalues'中的所有值都保证存在于'keys'中,则可以进一步简化;但生病留给读者作为练习。
import numpy_indexed as npi
arr = np.concatenate(listvalues)
idx = npi.indices(keys, arr, missing='mask')
remap = np.logical_not(idx.mask)
arr[remap] = np.array(values)[idx[remap]]
replaced = np.array_split(arr, np.cumsum([len(a) for a in listvalues][:-1]))