我有这个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]
答案 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值似乎是字节数组。因此,您需要复制到新数组以保留类型。