我有一个类似以下所示的2D Numpy整数数组:
a = np.array([[ 3, 0, 2, -1],
[ 1, 255, 1, 2],
[ 0, 3, 2, 2]])
我有一个具有整数键和值的字典,我想使用它来替换a
的值为新值。这个字典可能看起来像这样:
and I have a dictionary with integer keys and values that I would like to use to replace the values of a
with new values. The dict might look like this:
d = {0: 1, 1: 2, 2: 3, 3: 4, -1: 0, 255: 0}
我想用d
中与a
中的键匹配的相应值替换a
的值。换句话说,d
定义了a
中旧(当前)和新(期望)值之间的映射关系。对于上面的示例,结果如下:a_new = np.array([[ 4, 1, 3, 0],
[ 2, 0, 2, 3],
[ 1, 4, 3, 3]])
什么是实现这个的高效途径?这只是一个玩具示例,但在实际中,数组将会很大,它的形状将会是例如
(1024, 2048)
,而字典将有数十个元素 (在我的情况下为34个)。虽然键是整数,但它们并不一定都是连续的,也可能是负数 (就像上面的示例一样)。我需要对成千上万个这样的数组执行此替换,因此它需要快速进行。然而,字典是预先已知的且保持不变的,因此从渐近意义上讲,用于修改字典或将其转换为更合适的数据结构的任何时间都无关紧要。
我目前正在使用两个嵌套的
for
循环(在 a
的行和列上)循环遍历数组条目,但肯定还有更好的方法。如果映射不包含负值(例如,像示例中的 -1),我会创建一个列表或数组,其中键是数组索引,然后使用高效的 Numpy fancy indexing 程序进行操作。但既然还有负值,所以这种方法行不通。