gpt4 book ai didi

python - Numpy:使用字典作为映射有效地替换二维数组中的值

转载 作者:太空狗 更新时间:2023-10-29 20:22:25 26 4
gpt4 key购买 nike

我有一个 2D Numpy 整数数组,如下所示:

a = np.array([[  3,   0,   2,  -1],
[ 1, 255, 1, 2],
[ 0, 3, 2, 2]])

我有一个包含整数键和值的字典,我想用它来用新值替换 a 的值。字典可能看起来像这样:

d = {0: 1, 1: 2, 2: 3, 3: 4, -1: 0, 255: 0}

我想用 d 中的相应值替换 a 中与 d 中的键匹配的值。换句话说,d 定义了 a 中旧(当前)值和新(期望)值之间的映射。上面玩具示例的结果是这样的:

a_new = np.array([[  4,   1,   3,   0],
[ 2, 0, 2, 3],
[ 1, 4, 3, 3]])

什么是实现它的有效方法?

这是一个玩具示例,但实际上数组会很大,它的形状将是例如(1024, 2048),字典将有几十个元素的顺序(在我的例子中是 34 个),虽然键是整数,但它们不一定都是连续的,它们可以是负数(如上例所示)。

我需要在数十万个这样的数组上执行此替换,因此它需要快速。然而,字典是预先知道的并且保持不变,所以渐近地,任何时间用于修改字典或将其转换为更合适的数据结构都没有关系。

我目前正在两个嵌套的 for 循环中遍历数组条目(遍历 a 的行和列),但必须有更好的方法.

如果 map 不包含负值(例如示例中的 -1),我将只从字典创建一个列表或数组,其中键是数组索引,然后将其用于高效的 Numpy花哨的索引例程。但是因为也有负值,所以这行不通。

最佳答案

这是一种方法,如果你有一个小的字典/最小值和最大值,这可能更有效,你可以通过添加数组 min 来解决负索引:

In [11]: indexer = np.array([d.get(i, -1) for i in range(a.min(), a.max() + 1)])

In [12]: indexer[(a - a.min())]
Out[12]:
array([[4, 1, 3, 0],
[2, 0, 2, 3],
[1, 4, 3, 3]])

注意:这会将 for 循环移动到查找表,但如果它比实际数组小得多,这可能会快得多。

关于python - Numpy:使用字典作为映射有效地替换二维数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com