使用字典替换numpy数组元素

时间:2015-11-02 15:44:13

标签: python arrays numpy dictionary

我有这个numpy数组

message = [ 97 98 114 97]

和这本词典

codes = {97: '1', 98: '01', 114: '000'}

我正在迭代numpy数组并将这些数字转换为字典中对应的数字,如下所示:

[codes[i] for i in message]

但这真的很慢并占用了大量内存,因为我正在创建一个新列表。有更好的方法吗?也许我会有一个相同的numpy数组,但有这样的新数字?

message = [1 01 000 1]

2 个答案:

答案 0 :(得分:1)

这是使用np.searchsorted NumPythonic 解决方案 -

np.asarray(codes.values())[np.searchsorted(codes.keys(),message)]

请注意,输出也是NumPy数组。如果您想要一个列表输出,请用.tolist() -

包装它
np.asarray(codes.values())[np.searchsorted(codes.keys(),message)].tolist()

我认为这种方法的唯一瓶颈是使用np.asarray()转换为NumPy数组,因为通常np.searchsorted非常有效。

示例运行 -

In [36]: message = [ 97, 98, 114, 97]

In [37]: codes = {97: '1', 98: '01', 114: '000'}

In [38]: [codes[i] for i in message]
Out[38]: ['1', '01', '000', '1']

In [39]: np.asarray(codes.values())[np.searchsorted(codes.keys(),message)]
Out[39]: 
array(['1', '01', '000', '1'], 
      dtype='|S3')

答案 1 :(得分:0)

您可以非常简单地更新:

for i in np.arange(len(message)):
   message[i] = codes.get(message[i], message[i])

我确信有一个numpy特定的语法来迭代。但请注意,您不保留字节字符串,因为messages是int类型,并且您的dict值似乎是字节数组。因此,您需要复制到新数组以保留类型。