python - 替换大量数组中的值(性能)

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

非常感谢大家!!

最佳答案

使用 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/

相关文章:

python - 在 seaborn 图中使用 sns.set

python - 如何将包含字典列表的字符串转换为 Python 对象?

c - 如何在结构体数组中存储数字

c++ - 写在文件上,信息最终出现在控制台中

c# - wpf(太多绘图视觉效果)导致抖动平移和缩放

python - 获取 zip 文件中包含的文件的文件列表

python - 无序比较两个 NumPy 数组

python - 与独立的 Python 脚本相比,为什么 Jython 需要更多的执行时间

android - 长时间运行的 XML 解析方法中的奇怪行为

python - 在python程序中设置外部输入