我在使用字典替换数组列表的值时遇到性能问题。
假设这是我的字典:
# 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 循环,我怎样才能达到相同的结果?重要的是结果与输入的格式相同(具有替换值的数组列表)
非常感谢大家!!
最佳答案
使用 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]))
关于python - 替换大量数组中的值(性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508116/