如何使用字典翻译/替换数组元素?

时间:2015-11-04 18:42:32

标签: python arrays numpy dictionary

我有一个numpy数组,它有数百个大写字母元素,没有特别的顺序

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J', ...])

numpy.ndarray中的每个元素都是numpy.string_

我还有一个“翻译词典”,其键/值对使得大写字母对应一个城市

transdict = {'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne',...}

字典transdict中只有26对,但是我必须翻译的numpy数组中有数百个字母。

最有效的方法是什么?

我考虑过使用numpy.core.defchararray.replace(a, old, new, count=None)[source],但这会返回ValueError,因为numpy数组与字典键/值的大小不同。

AttributeError: 'numpy.ndarray' object has no attribute 'translate'

2 个答案:

答案 0 :(得分:6)

使用暴力 NumPy broadcasting -

Fatal error: Uncaught exception `'Abraham\TwitterOAuth\TwitterOAuthException'` with message 

'<?xml version="1.0" encoding="UTF-8"?>
<hash> 
    <error>Desktop applications only support the oauth_callback value 'oob'</error>
    <request>/oauth/request_token</request>
</hash> '
in `/home/mediahyp/public_html/tweetme/twitteroauth/src/TwitterOAuth.php:138` 

Stack trace: 

#0 /home/mediahyp/public_html/tweetme/twitter-go.php(13): Abraham\TwitterOAuth\TwitterOAuth->oauth('oauth/request_t...', Array) 
#1 {main} thrown in /home/mediahyp/public_html/tweetme/twitteroauth/src/TwitterOAuth.php on line 138

基于np.searchsorted的搜索和索引 -

idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
out = np.asarray(transdict.values())[idx]

示例运行 -

sort_idx = np.argsort(transdict.keys())
idx = np.searchsorted(transdict.keys(),abc_array,sorter = sort_idx)
out = np.asarray(transdict.values())[sort_idx][idx]

答案 1 :(得分:4)

这会吗?有时,普通的Python是处理这类事情的好方法。下面构建了一个翻译列表(很容易转换回numpy数组)和连接的输出。

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J'])

transdict = {'A': 'Adelaide',
             'B': 'Bombay',
             'C': 'Cologne',
             'D': 'Dresden',
             'E': 'Erlangen',
             'F': 'Formosa',
             'G': 'Gdansk',
             'H': 'Hague',
             'I': 'Inchon',
             'J': 'Jakarta',
             'Z': 'Zambia'
}

phoenetic = [transdict[letter] for letter in abc_array]
print ' '.join(phoenetic)

这个输出是:

Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta