替换大型数组列表中的值(性能)

时间:2016-07-21 15:17:59

标签: python arrays performance numpy for-loop

我使用字典替换数组列表的值存在性能问题。

让我们说这是我的字典:

# 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,我怎么能达到相同的效果?重要的是结果与输入格式相同(具有替换值的数组列表)

非常感谢你们!

1 个答案:

答案 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]))