【发布时间】:2018-04-02 18:59:28
【问题描述】:
我有一个二维 Numpy 整数数组,如下所示:
a = np.array([[ 3, 0, 2, -1],
[ 1, 255, 1, 2],
[ 0, 3, 2, 2]])
我有一个包含整数键和值的字典,我想用它来用新值替换 a 的值。 dict 可能如下所示:
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 的行和列上),但必须有更好的方法。
如果映射不包含负值(例如示例中的 -1),我只需从字典中创建一个列表或数组,其中键是数组索引,然后将其用于高效的 Numpy花哨的索引例程。但是由于也有负值,所以这行不通。
【问题讨论】:
-
我非常喜欢这个问题。两个想法:(1) 用一个聪明的 NumPy 数组替换 dict,正如 Andy 在下面建议的那样(还有其他一些方法可以构造索引器和/或通过函数然后是索引器运行原始数据值)或 (2) 考虑使用一个 Pandas Series/DataFrame,它有一些不错的替换方法,可能足够快。
-
好点,我会研究 Pandas 数据结构!
-
Fast replacement of values in a numpy array 的可能重复项...(在我回答后发现)。
-
@wwii 我不太相信那里的数字,我认为如果它肯定是一个小字典,但如果它只有几倍的元素,它会慢得多。无论如何,我认为我们的两个答案是尝试的两种解决方案(取决于您的 dict/data 一个会更快/最好):)
-
@Alex 请在此处查看我更新的解决方案以利用一对一映射案例 - stackoverflow.com/a/46870227 应该非常有效。
标签: python arrays numpy dictionary